J()中的列名是否冲突/重复?

时间:2013-05-12 21:23:58

标签: r data.table

我有两个共享列名的data.tables(datresults)。在旁注中,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

1 个答案:

答案 0 :(得分:1)

您要做的是joincolX上的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方法。