从与变量匹配的另一列查找值

Lookup value from another column that matches with variable

我的数据框如下所示:

animal_id   trait_id    sire_id dam_id
    1         25.05        0       0
    2         -46.3        1       2
    3          41.6        1       2
    4         -42.76       3       4
    5         -10.99       3       4
    6         -49.81       5       4

我想创建另一个变量,其中包含每个 "sire_id" 和 "dam_id" 的 "trait_id" 估计值。

所有父亲 (sire_id) 和母亲 (dam_id) 也出现在 animal_id 列中。所以我想做的是在 trait_id 中寻找它们的测量值并在新变量中重复这个变量。

我想要的结果是:

animal_id   trait_id    sire_id trait_sire  dam_id  trait_dam
     1       25.05         0        NA        0        NA
     2       -46.3         1       25.05      2       -46.3
     3       41.6          1       25.05      2       -46.3
     4      -42.76         3       41.6       4       -42.76
     5      -10.99         3       41.6       4       -42.76
     6      -49.81         5      -10.99      4       -42.76

如有任何建议,我们将不胜感激。

可以使用matchmatch(col, df$animal_id)给出了animal_id中col中元素对应的索引,可以进一步定位trait的值:

df[c("trait_sire", "trait_dam")] <- 
    lapply(df[c("sire_id", "dam_id")], function(col) df$trait_id[match(col, df$animal_id)])

df
#  animal_id trait_id sire_id dam_id trait_sire trait_dam
#1         1    25.05       0      0         NA        NA
#2         2   -46.30       1      2      25.05    -46.30
#3         3    41.60       1      2      25.05    -46.30
#4         4   -42.76       3      4      41.60    -42.76
#5         5   -10.99       3      4      41.60    -42.76
#6         6   -49.81       5      4     -10.99    -42.76

与 data.table 加入...

library(data.table)
setDT(DT)    

DT[, trait_sire := 
  .SD[.SD, on=.(animal_id = sire_id), x.trait_id ]
]

DT[, trait_dam := 
  .SD[.SD, on=.(animal_id = dam_id), x.trait_id ]
]

   animal_id trait_id sire_id dam_id trait_sire trait_dam
1:         1    25.05       0      0         NA        NA
2:         2   -46.30       1      2      25.05    -46.30
3:         3    41.60       1      2      25.05    -46.30
4:         4   -42.76       3      4      41.60    -42.76
5:         5   -10.99       3      4      41.60    -42.76
6:         6   -49.81       5      4     -10.99    -42.76

语法是 x[i, on=, j],其中 j 是列的一些函数。要查看它是如何工作的,请尝试 DT[DT, on=.(animal_id = dam_id)] 和变体。一些注意事项:

  1. i.* / x.* 语法有助于区分列的来源。
  2. jv := expression 时,表达式分配给列 v
  3. 联接 x[i, ...] 使用 i 的行来查找 x 的行。
  4. on= 语法类似于 .(xcol = icol).
  5. j里面,table本身可以写成.SD.

这种方法优于 match 的一个优点是它扩展到连接多个列,例如 on = .(xcol = icol, xcol2 = icol2) 甚至 "non equi joins",例如 on = .(xcol < icol)。此外,它是对 table 进行操作的一致语法的一部分(在包的 introductory material 中进行了解释),而不是针对一项任务的专门代码。

您可以使用 match(在 base R 中)在一个 运行 中完成此操作(无需循环)

df[c("trait_sire", "trait_dam")] <- 
cbind(with(df, trait_id[match(sire_id, animal_id)]), 
      with(df, trait_id[match(dam_id, animal_id)]))

  # animal_id trait_id sire_id dam_id trait_sire trait_dam
# 1         1    25.05       0      0         NA        NA
# 2         2   -46.30       1      2      25.05    -46.30
# 3         3    41.60       1      2      25.05    -46.30
# 4         4   -42.76       3      4      41.60    -42.76
# 5         5   -10.99       3      4      41.60    -42.76
# 6         6   -49.81       5      4     -10.99    -42.76