我想根据匹配变量(如果有)和其他条件(如果没有)在数据框中添加新列。当我使用
match
函数时,我意识到数据帧之间存在不一致(字面意义上的混乱 - 我知道,索引),并且主数据帧具有重复的观察结果,而第二个数据帧中的观察结果是唯一的。
所以这是模仿的数据框:
df = data.frame(kin1 = c("392", "392", "694", "615", "392", NA, "782"),
anon = c("D1","D2","D3","D4", "D5","D6", "D7"))
df2 = data.frame(id = c("424","392", "615","429"),
rep = c("H1", "H2", "H3", "H4"))
我想做的是在以下条件下为第一个数据框创建第三列:
kin1
中df
列中的变量与
id
中的变量 df2
列,则 df
中的新列应该
取 rep
的 df2
列中的值。kin1
中 df
列中的变量是 NA
,那么 df
中的新列也应该是 NA
。df
中的新列应该
取同一数据帧的 anon
列中的值。所以我想要的输出应该是这样的:
desired.df
kin1 anon new_id
1 392 D1 H2
2 392 D2 H2
3 694 D3 D3
4 615 D4 H3
5 392 D5 H2
6 <NA> D6 <NA>
7 782 D7 D7
我已经尝试过嵌套 for 循环,看起来它正在工作,但我的真实数据很大,所以我真的需要更智能、更快的东西来解决我的问题。
提前致谢。
merge(df, df2, by.x = "kin1", by.y = "id", all.x = TRUE) |>
transform(rep = ifelse(is.na(kin1), NA, ifelse(is.na(rep), anon, rep)))
# kin1 anon rep
# 1 392 D1 H2
# 2 392 D2 H2
# 3 392 D5 H2
# 4 615 D4 H3
# 5 694 D3 D3
# 6 782 D7 D7
# 7 <NA> D6 <NA>
我一般不喜欢嵌套
ifelse
(一般来说ifelse
),但这已经足够好了。