[英]Assigning groups by multiple rows in data.table in R
我有一個包含個人和一些屬性的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"))
我想通過屬性列的組合對個人進行分組,以便具有屬性“ a”,“ b”和“ c”的個人1和3將在組1中,而個人2將在組2中。 。
這是一種方法
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
(因為此counter關鍵字已優化;請參見?GForce
); 並在i
使用order
而不是在j
中sort
(因為這意味着更少的排序調用):
dt[order(attribute), allAts := paste(attribute, collapse=""), by=individual
][, group := .GRP, by=allAts]
產生相同的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.