R语言 如何根据模式添加前导零?

3pmvbmvn  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(189)

我有下面的数据集和这段代码,它将向带有破折号的值添加前导零,使它们具有XXXXXXXX-XX模式。它部分工作:

df.direccionamientos = structure(list(D_CodSerTecAEntregar = c("139",
                                                               "20018219-1", 
                                                               "2019-1", 
                                                               "20018219-1"
                                                               
                                                               )), 
                                 .Names = "D_CodSerTecAEntregar", 
                                 row.names = c(NA, -4L),
                                 class = c("tbl_df", "tbl", "data.frame"))

#Leading zeroes
df.direccionamientos$D_CodSerTecAEntregar1 <- ifelse(grepl('-', df.direccionamientos$D_CodSerTecAEntregar), 
                                                      do.call(sprintf, c(fmt = '%08d-%02d', 
                                                                         read.table(text = df.direccionamientos$D_CodSerTecAEntregar,
                                                                                    header = FALSE, sep="-", 
                                                                                    fill = TRUE))), 
                                                     df.direccionamientos$D_CodSerTecAEntregar)

但是,当具有不同模式的新值通过代码时,这变得复杂(参见新数据集的第5行)。它会打乱所有新创建的代码:

df.direccionamientos = structure(list(D_CodSerTecAEntregar = c("139",
                                                               "20018219-1", 
                                                               "2019-1", 
                                                               "20018219-1",
                                                               "1R1033181000100"
                                                               
                                                               )), 
                                 .Names = "D_CodSerTecAEntregar", 
                                 row.names = c(NA, -5L),
                                 class = c("tbl_df", "tbl", "data.frame"))

#Leading zeroes
df.direccionamientos$D_CodSerTecAEntregar1 <- ifelse(grepl('-', df.direccionamientos$D_CodSerTecAEntregar), 
                                                      do.call(sprintf, c(fmt = '%08d-%02d', 
                                                                         read.table(text = df.direccionamientos$D_CodSerTecAEntregar,
                                                                                    header = FALSE, sep="-", 
                                                                                    fill = TRUE))), 
                                                     df.direccionamientos$D_CodSerTecAEntregar)

jfewjypa

jfewjypa1#

问题是,当输入中有字母时,在应用sprintf之前,字段不能自动转换为整数。下面是一个使用tidyrdplyr的简化,它纠正了这个问题(并且应该更有效):

library(tidyr)
library(dplyr)

df.direccionamientos %>%
  separate(D_CodSerTecAEntregar, sep = "-", into = c("a", "b"), remove = FALSE, fill = "right") %>%
  mutate(
    across(c(a, b), as.integer),
    result = ifelse(!is.na(b), sprintf("%08d-%02d", a, b), D_CodSerTecAEntregar)
  ) %>%
  select(-a, -b)
# # A tibble: 5 x 2
#   D_CodSerTecAEntregar result         
#   <chr>                <chr>          
# 1 139                  139            
# 2 20018219-1           20018219-01    
# 3 2019-1               00002019-01    
# 4 20018219-1           20018219-01    
# 5 1R1033181000100      1R1033181000100

相关问题