使用列名和前缀在 across 语句内合并

问题描述 投票:0回答:1

我再次觉得我应该能够做一些看起来不太复杂的事情,但我无法弄清楚。

我有一个数据框

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
内完成它......但也许不能!

非常感谢任何帮助或建议!

r dplyr prefix coalesce across
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.