gpt4 book ai didi

r - 如何计算一个元素在 data.table 中连续出现的次数?

转载 作者:行者123 更新时间:2023-12-04 17:18:19 24 4
gpt4 key购买 nike

我有一个看起来像这样的 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

或者像@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

关于r - 如何计算一个元素在 data.table 中连续出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29641792/

24 4 0