通过比较 R 中多个数据帧和条件的值来添加新列

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

我想根据匹配变量(如果有)和其他条件(如果没有)在数据框中添加新列。当我使用

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"))

我想做的是在以下条件下为第一个数据框创建第三列:

    1. 如果
      kin1
      df
      列中的变量与
      id
      中的变量
      df2
      列,则
      df
      中的新列应该 取
      rep
      df2
      列中的值。
    1. 如果
      kin1
      df
      列中的变量是
      NA
      ,那么
      df
      中的新列也应该是
      NA
    1. 最后,如果两个条件都不满足,则
      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 循环,看起来它正在工作,但我的真实数据很大,所以我真的需要更智能、更快的东西来解决我的问题。

提前致谢。

r dataframe conditional-statements
1个回答
0
投票

基础R

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
),但这已经足够好了。

© www.soinside.com 2019 - 2024. All rights reserved.