R 如何计算元素在data.table中连续出现的次数?

R 如何计算元素在data.table中连续出现的次数?,r,data.table,R,Data.table,我有一个data.table,看起来像这样 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 基本上是通过使用Order列对数据进行排序。我想了解每个ID的连续B的数量。理想情况下,我想要的输出是 ID, Consec 1, 2 1, 4 因为段B连续出现在第2行和第3行(2次),然后再次出现在第5、6、7、8行(4次) 循环解决方案非常明显,但也会非常缓慢 data.tabl

我有一个data.table,看起来像这样

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
基本上是通过使用Order列对数据进行排序。我想了解每个ID的连续B的数量。理想情况下,我想要的输出是

ID, Consec
1, 2
1, 4
因为段B连续出现在第2行和第3行(2次),然后再次出现在第5、6、7、8行(4次)

循环解决方案非常明显,但也会非常缓慢

data.table中是否有同样快速的优雅解决方案

另外,我正在处理的数据大约有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
或者像埃迪建议的那样

 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所建议)


你真的不需要显式地创建一个新列,并且可以动态地创建:
DT[order(ID,order)][,(concer=.N),by=(ID,Segment,rleid(Segment))[Segment='B',(ID,concer)]
为什么你需要
order()
?@Arun它给出了一个不同的答案,没有这里的顺序
set.seed(42);d1@akrun,谢谢。在这种情况下,如果可能的话,我会使用
setorder()
,因为
DT[order()][…]
会在内存中的一个新位置创建有序数据。我问了一个类似的问题,得到了一些有用的回答。值得一看:[1]:
  setorder(DT, ID, Order)[, .(Consec = .N), by = .(ID, Segment, 
                rleid(Segment))][Segment == 'B', .(ID, Consec)]
  #   ID Consec
  #1:  1      2
  #2:  1      4