1

我有两个共享列名的 data.tables (datresults)。附带说明一下,results保存先前在 * sub *groups of上计算的汇总统计信息dat。换句话说,nrow(results) != nrow(dat)(但我认为这与问题无关)现在我想dat通过添加一个新列(即 NewColZ)将这些结果合并回(即原始 data.table)dat

这不像我预期的那样工作:

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

4

1 回答 1

1

您正在尝试做的是joinon colXand 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方法。

于 2013-05-12T22:56:55.540 回答