跨越,如果:如果列名出现在第一列中,则替换为具有相同名称的不同数据框中的值

Mutate across, if: if column name occurs in first column, replace by value from different dataframe with same name

我有两个数据框:一个我想替换其中的值 (df_1),另一个我想从中获取替换值 (df_2)。请考虑以下示例数据:

数据

df_1 <- data.frame(
  var=c("xAp", "xBp", "sCp", "sABp", "dBCp", "dCBp"), 
  A=NA, 
  B=NA, 
  C=NA)

df_2 <- data.frame(A=1, B=40, C=25)

需要的操作

如果在 df_1 中列名出现在第一列,那么我想用 df_2 中的值替换该列和行中的值,该值对应于该列姓名。想象一下单元格 df_1[1,2]。列名是 A。值 A 出现在第一列(在 df_1[1,1] 中)。这意味着我想用 df_2 中属于 A 的值替换 NA 值,即 1.

如果列名未出现在第一列中,我希望将其替换为零。

因为我想对每一行执行这个动作,所以我一直在考虑将 mutate 与 across 结合起来。然而,在尝试提取列名并将它们与第一列中的值进行比较时,我已经卡住了。

预期输出

data.frame(
  var=c("xAp", "xBp", "sCp", "sABp", "dBCp", "dCBp"), 
  A=c(1, 0, 0, 1, 0, 0), 
  B=c(0, 40, 0, 40, 40, 40), 
  C=c(0, 0, 25, 0, 25, 25))

如果有人能帮忙就太好了。谢谢!

这是一个选项 - 循环 across 'df_2' 的列名,创建条件 'var' 列子字符串是否存在于 (cur_column()) 中,然后 return 相应列的 'df_2' 的值,否则 return 0 in case_when

library(dplyr)
library(stringr)
out2 <- df_1 %>%
    mutate(across(all_of(names(df_2)), 
     ~ case_when(str_detect(var, cur_column()) ~ df_2[[cur_column()]], TRUE ~ 0)))

-检查 OP 的预期

 identical(out, out2)
[1] TRUE