【发布时间】:2019-07-25 02:19:50
【问题描述】:
我一直在尝试将mutate_at 与coalesce 结合起来,以防动态生成列名。
在我的示例中只有五列,但在实际数据中还有更多(并非所有列都应包含在coalesce 步骤中)。
示例 DF:
data_example <- data.frame(
aa = c(1, NA, NA),
bb = c(NA, NA, 2),
cc = c(6, 7, 8),
aa_extra = c(2, 2, NA),
bb_extra = c(1, 2, 3)
)
预期输出:
aa bb cc aa_extra bb_extra
1 1 1 6 2 1
2 2 2 7 2 2
3 NA 2 8 NA 3
输出为structure:
structure(list(aa = c(1, 2, NA), bb = c(1, 2, 2), cc = c(6, 7,
8), aa_extra = c(2, 2, NA), bb_extra = c(1, 2, 3)), class = "data.frame", row.names = c(NA,
-3L))
我尝试过类似的方法,但没有成功(“只有字符串可以转换为符号”)。我想避免创建额外的变量,只需在 mutate_at 表达式中包含所有内容,因为这是更长的 dplyr“流”的一部分。
data_example %>%
dplyr::mutate_at(
gsub("_extra", "", grep("_extra$",
colnames(.),
perl = T,
value = T)),
dplyr::funs(
dplyr::coalesce(., !!! dplyr::sym(paste0(., "_extra")))
)
)
我也试过这个(没有错误,但 bb 列的值是错误的):
data_example %>%
dplyr::mutate_at(
gsub("_extra", "", grep("_extra$",
colnames(.),
perl = T,
value = T)),
dplyr::funs(
dplyr::coalesce(., !!as.name(paste0(names(.), "_extra")))
)
)
如何获取已处理列的名称并将其传递给coalesce?
【问题讨论】: