我再次觉得我应该能够做一些看起来不太复杂的事情,但我无法弄清楚。
我有一个数据框
df
,其中包含变量a1, v_a1, a2, v_a2
等等。我想做的就是 mutate
我的数据框,以便 a1 = coalesce(a1, v_a1)
和 a2 = coalesce(a2, v_a2)
我尝试了很多不同的方法,但保持它还不太有效。
这是一个玩具示例和我尝试过的事情:
df <- data.frame(
a1 = c(1,NA,2,NA),
v_a1 = c(NA,0,NA,5),
a2 = c(4,NA,8,NA),
v_a2 = c(NA,7,NA,NA),
a11 = c("just here","to force","the use of paste0","inside the coalesce"))
df %>% mutate(
across(c(a1,a2),
~ coalesce(!!!select(matches(paste0(cur_column(),"$"))))))
这会引发有关
cur_column()
的错误,“只能在 across()
内部使用”。当第一次声明一个带有 df 和可变参数的函数来包装合并时,我遇到了同样的错误,但它似乎不欣赏 .data[[cur_column()]]
中的
across
df %>% mutate(
across(c(a1,a2),
~ coalesce(across(all_of(c(cur_column(), paste0("v_", cur_column())))))))
这个没有错误,但输出真的很奇怪,将小标题转换为字符串并进行一些粘贴。这让我很困惑。
这个主题非常接近如何基于前缀模式合并列块但是
coalesce
在contains
中使用了我没有的原始字符串(因此需要cur_column
而且它使用 for 循环,而我认为我应该能够在 across
内完成它......但也许不能!
非常感谢任何帮助或建议!
您可以使用
matches
,它接受正则表达式,而不是 contains
,它需要字面字符串:
df %>%
mutate(a1_coalesce = coalesce(!!!select(., matches("a1$|v_a1"))),
a2_coalesce = coalesce(!!!select(., matches("a2$|v_a2"))))
a1 v_a1 a2 v_a2 a11 a1_coalesce a2_coalesce
1 1 NA 4 NA just here 1 4
2 NA 0 NA 7 to force 0 7
3 2 NA 8 NA the use of paste0 2 8
4 NA 5 NA NA inside the coalesce 5 NA