R语言data.table连接操作时如何指定获取结果的对应列
正确实现方案
方案1:使用by = .EACHI逐组取值(写法直观)
利用data.table连接时的逐组运算特性,每组对应唯一的column取值,可直接用get取出对应列的值:
library(data.table) # 原始数据 tab1 = data.table(z = c(1,2,3,4), x = c("A", "B", "C", "D"), y = c("E", "F", "G", "H")) tab2 = data.table(z = c(1,2,3,4), column = c("x", "x", "y", "y")) # 核心代码 tab2[, val := tab1[tab2, on = .(z), get(i.column), by = .EACHI]$V1]
运行后tab2的结果完全符合预期:
| z | column | val |
|---|---|---|
| 1 | x | A |
| 2 | x | B |
| 3 | y | G |
| 4 | y | H |
方案2:矩阵索引(大数据量下效率更高)
将tab1的目标列转为矩阵,通过行列坐标直接定位取值,避免逐组运算开销:
tab2[, val := as.matrix(tab1[, .(x, y)])[cbind(match(tab2$z, tab1$z), match(tab2$column, c("x", "y")))]]
原写法失效原因说明
- 第一种写法
get(i.column):i.column是长度为4的完整向量,get仅支持传入单个列名字符串,无法批量解析向量内的多个列名 - 第二种写法
column, with=F:此处的column会被识别为要从tab1中取名字为column的列,但tab1不存在该列,因此无法返回预期结果
内容的提问来源于stack exchange,提问作者Laurence_jj
相关产品推荐
相关产品推荐

