我有两个共享列名的data.tables(dat
和results
)。在旁注中,results
包含先前在* {em> sub * dat
组上计算的汇总统计信息。换句话说,nrow(results) != nrow(dat)
(但我不认为这与问题相关)
现在我想通过向dat
添加新列(即NewColZ)将这些结果合并回dat
(即原始data.table)
这不符合我的预期:
dat[,list(colA,colB,NewColZ=results1[colX==colX & colY==colY,colZ])
,by=list(colX, colY)]
为什么呢?因为“colX”和“colY”是data.tables中的列名(即dat和results)。我想说的是,results1[take_from_self(colX)==take_from_parent(colX)]
因此以下工作(观察我只重新列了列)
dat[,list(colA,colB,NewCol=results1[cx==colX & cy==colY,colZ,])
,by=list(colX, colY)]
虽然我觉得这可以通过联接简单轻松地完成。但dat
列的列数多于results
答案 0 :(得分:1)
您要做的是join
和colX
上的colY
。您可以使用:=
通过引用进行分配。当你有独特的组合(我假设你这样做)时,加入是最直接的
keys <- c('colX', 'colY')
setkeyv(dat, keys)
setkeyv(results, keys)
dat[results, newcolZ := colZ]
# perhap use `i.` if there is a colZ in dat
# dat[results, newcolZ := i.colZ]
我同意建议阅读常见问题解答和介绍小插曲以及浏览?data.table
中的许多示例的评论。
您的问题是一个范围问题,但您的主要问题并不是完全了解data.table惯用法。 join
方法是偶然的data.table
方法。