使用模式mutate_at重命名多个变量

时间:2019-12-10 09:21:49

标签: r dplyr

我有一个数据集,其中包含许多名称相似的列。某些列的值以美分为单位,而其他列的值为美元,例如:

library (tidyverse) 

data<- tribble(
          ~col1_cents, ~col1,~col2_cents, ~col2,
          1000,           NA,       3000,    NA,
          NA,             20,         NA,  25.2,
          2000,           NA,       2030,    NA,
        )

对于一个变量,很容易将值除以100,然后将其分配给dollar变量,然后删除美分变量,例如:

data %>% mutate( if_else(is.na(col1),
                         col1_cents/100,
                         col1) %>% 
         select(-col1_cents)

对于以_cents结尾的数据集中的所有变量,是否有一种通用的方法?我用mutate_at和ends_with尝试了此操作,但没有_cents ...

无法将其重命名为原始变量。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用mutate_at

library(dplyr)
data %>%  mutate_at(vars(ends_with("cents")), ~./100)

# A tibble: 3 x 4
#   col1_cents  col1 col2_cents  col2
#       <dbl> <dbl>      <dbl> <dbl>
#1         10    NA       30    NA  
#2         NA    20       NA    25.2
#3         20    NA       20.3  NA  

如果您随后想要合并两列,则可以使用split.default根据名称的相似性来拆分列,将imap_dfc中的purrrcoalesce一起使用将它们结合在一起。

df1 <- data %>%  mutate_at(vars(ends_with("cents")), ~./100)

purrr::imap_dfc(split.default(df1, sub("_.*", "", names(df1))), 
 ~.x %>% mutate(!!.y := coalesce(.x[[2]], .x[[1]])) %>% select(.y))

#  col1  col2
#  <dbl> <dbl>
#1    10  30  
#2    20  25.2
#3    20  20.3