跨越,如果:如果列名出现在第一列中,则替换为具有相同名称的不同数据框中的值
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
我有两个数据框:一个我想替换其中的值 (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