data.table - 除一个列外,按所有列进行分组

7
我可以使用data.table按除一列外的所有列进行分组吗? 我有很多列,因此我宁愿避免写出所有colnames
原因是我想在一个表中合并重复项,其中我知道一列没有相关性。
library(data.table)

DT <- structure(list(N = c(1, 2, 2), val = c(50, 60, 60), collapse = c("A", 
"B", "C")), .Names = c("N", "val", "collapse"), row.names = c(NA, 
-3L), class = c("data.table", "data.frame"))

> DT
   N val collapse
1: 1  50        A
2: 2  60        B
3: 2  60        C

也就是说,给定DT,是否有类似于DT[, print(.SD), by = !collapse]这样的东西,它会给出如下结果:
> DT[, print(.SD), .(N, val)]
   collapse
1:        A
   collapse
1:        B
2:        C

我不需要实际指定.(N, val)吗?我知道我可以通过复制和粘贴列名来做到这一点,但我认为也许有更优雅的方法来实现这一点。


我认为这几乎是一个重复的问题,与此 http://stackoverflow.com/questions/29368785/how-to-pass-all-columns-except-one-as-argument-to-setkey 相同。 - David Arenburg
1个回答

14

要按除一列之外的所有列进行分组,您可以使用:

by = setdiff(names(DT), "collapse")

解释: setdiff 的一般形式为 setdiff(x, y),它返回所有在 x 中而不在 y 中的值。在这种情况下,它意味着返回所有列名,除了collapse列。


两种替代方法:

# with '%in%'
names(dt1)[!names(dt1) %in% 'colB']

# with 'is.element'
names(dt1)[!is.element(names(dt1), 'colB')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接