我有个人和某些属性的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组。我感谢任何帮助。
答案 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.integer
和factor
(因为此计数器关键字已优化;请参阅?GForce
);并在order
中使用i
代替sort
中的j
(因为这意味着更少的排序调用):
dt[order(attribute), allAts := paste(attribute, collapse=""), by=individual
][, group := .GRP, by=allAts]
产生相同的输出。