在R中的data.table中按多行分配组

时间:2017-03-15 13:18:07

标签: r data.table grouping

我有个人和某些属性的data.table:

dt=data.table(individual=c(1,1,1,2,2,2,3,3,3), attribute=c("a","b", "c", "d", "e", "f", "a", "b", "c"))

我希望通过属性列的组合对个人进行分组,以便个人1和3具有属性" a"," b"和" c"将在第1组,第2组将在第2组。我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是一种方法

dt[, allAts := Reduce(paste0, sort(attribute)), by=individual
   ][, group := as.integer(factor(allAts))]

返回

dt
   individual attribute allAts group
1:          1         a    abc     1
2:          1         b    abc     1
3:          1         c    abc     1
4:          2         d    def     2
5:          2         e    def     2
6:          2         f    def     2
7:          3         a    abc     1
8:          3         b    abc     1
9:          3         c    abc     1

第一个链使用Reduce将已排序的属性粘贴到每个人的名为allAts的变量中。第二个链使用allAts构造一个因子变量,然后将其转换为整数。如果需要,可以通过将链[, allAts := NULL]添加到结尾来删除allAts变量。

@Frank建议的替代方法是将data.table .GRP关键字与by值一起使用,而不是使用基本R函数as.integerfactor(因为此计数器关键字已优化;请参阅?GForce);并在order中使用i代替sort中的j(因为这意味着更少的排序调用):

dt[order(attribute), allAts := paste(attribute, collapse=""), by=individual
   ][, group := .GRP, by=allAts]

产生相同的输出。