我有一个数据集,其中包含许多名称相似的列。某些列的值以美分为单位,而其他列的值为美元,例如:
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 ...
无法将其重命名为原始变量。谢谢!
答案 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
中的purrr
与coalesce
一起使用将它们结合在一起。
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