我有一個包含組和值的 data.table。我想保留組中第一次出現的所有條目(從表格頂部到底部)。
例子:
set.seed(666)
group = c(1,1,1,2,2,3,3,3,1,1,4,4,4,1,1,2)
value = runif(16)
DT = data.table(group,value)
> DT
group value
1: 1 0.77436849
2: 1 0.19722419
3: 1 0.97801384
4: 2 0.20132735
5: 2 0.36124443
6: 3 0.74261194
7: 3 0.97872844
8: 3 0.49811371
9: 1 0.01331584
10: 1 0.25994613
11: 4 0.77589308
12: 4 0.01637905
13: 4 0.09574478
14: 1 0.14216354
15: 1 0.21112624
16: 2 0.81125644
我想要實作的目標(第 9、10、14、15 和 16 行已被洗掉,因為第 1 組和第 2 組之前已經出現):
> DT
group value
1: 1 0.77436849
2: 1 0.19722419
3: 1 0.97801384
4: 2 0.20132735
5: 2 0.36124443
6: 3 0.74261194
7: 3 0.97872844
8: 3 0.49811371
11: 4 0.77589308
12: 4 0.01637905
13: 4 0.09574478
我認為這DT[,.SD[1], by = "group", .SDcols = "value"]給了我每個組的第一個條目,但我希望所有條目直到組更改(例如,在這種特殊情況下,組 1 的前三個條目)。
我考慮過使用類似的東西DT[,.I, by = group],它可以為每個條目提供按組排序的行索引,但我完全不知道如何優雅地識別 data.table 運算式中的這種“中斷”。
編輯:我像這樣找到每組的最大行數,但不知道如何從這里繼續:
maxRow = setnames(DT[, na.omit(which(diff(.I) > 1)[1]), by = "group"], "V1", "maxRow")
uj5u.com熱心網友回復:
一種可能的解決方案:
DT[,.(group,value,rleid=rleid(group))][,.SD[rleid==min(rleid),.(value)],by=group]
group value
<num> <num>
1: 1 0.77436849
2: 1 0.19722419
3: 1 0.97801384
4: 2 0.20132735
5: 2 0.36124443
6: 2 0.74261194
7: 3 0.97872844
8: 3 0.49811371
9: 3 0.01331584
10: 4 0.01637905
11: 4 0.09574478
12: 4 0.14216354
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522771.html
標籤:r数据表
上一篇:ggplot中兩行之間的陰影區域
