我有一个看起来像这样的数据表
ID, Order, Segment
1, 1, A
1, 2, B
1, 3, B
1, 4, C
1, 5, B
1, 6, B
1, 7, B
1, 8, B
基本上是通过使用“订购”列对数据进行订购。我想了解每个ID的连续B数。理想情况下,我想要的输出是
ID, Consec
1, 2
1, 4
因为段B在第2行和第3行连续出现(2次),然后在第5、6、7、8行再次出现(4次)。
循环解决方案非常明显,但速度也很慢。
在data.table中是否有快速简便的优雅解决方案?
P.S.我正在处理的数据大约有2000万行。
最佳答案
尝试
library(data.table)#v1.9.5+
DT[order(ID, Order)][, indx:=rleid(Segment)][Segment=='B',
list(Consec=.N), by = list(indx, ID)][,indx:=NULL][]
# ID Consec
#1: 1 2
#2: 1 4
或者按照@eddi的建议
DT[order(ID, Order)][, .(Consec = .N), by = .(ID, Segment,
rleid(Segment))][Segment == 'B', .(ID, Consec)]
# ID Consec
#1: 1 2
#2: 1 4
内存效率更高的方法是使用
setorder
而不是order
(如@Arun所建议) setorder(DT, ID, Order)[, .(Consec = .N), by = .(ID, Segment,
rleid(Segment))][Segment == 'B', .(ID, Consec)]
# ID Consec
#1: 1 2
#2: 1 4