从与变量匹配的另一列查找值
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
如有任何建议,我们将不胜感激。
可以使用match
; match(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)]
和变体。一些注意事项:
i.*
/ x.*
语法有助于区分列的来源。
- 当
j
为 v := expression
时,表达式分配给列 v
。
- 联接
x[i, ...]
使用 i
的行来查找 x
的行。
on=
语法类似于 .(xcol = icol)
.
- 在
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
我的数据框如下所示:
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
如有任何建议,我们将不胜感激。
可以使用match
; match(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)]
和变体。一些注意事项:
i.*
/x.*
语法有助于区分列的来源。- 当
j
为v := expression
时,表达式分配给列v
。 - 联接
x[i, ...]
使用i
的行来查找x
的行。 on=
语法类似于.(xcol = icol)
.- 在
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