我发现了data.table,我遇到了一个迭代问题。我正在尝试创建一个新列,它将计算一个值等于前一行中的值的连续次数。
例如,使用data.table a :
a
V1 V2
1: 1 1
2: 2 1
3: 3 2
4: 4 2
5: 5 2
我想创建第三列,它将显示列V2等于V2列中前一行的连续次数:
a
V1 V2 V3
1: 1 1 0
2: 2 1 1
3: 3 2 0
4: 4 2 1
5: 5 2 2
我可以用for来做到这一点,但是对于大数据。它需要永远。 我可以使用联接,.I,.SD或特定于data.table的内容来加快速度吗?
目前我正在使用简单的顺序C风格循环编程:
a[,V3:=0]
for (i in 2:nrow(a))
{
if (a[i,V2]==a[i-1,V2]) a[i,V3 := a[i-1,V3] + 1]
}
我不能做的是在矢量风格编程中进行转换。
感谢您的见解。
答案 0 :(得分:1)
这是你需要的吗?
library(data.table)
DT <- data.table(read.table(text="1 1
2 1
3 2
4 2
5 2"))
#put values not different from the preceding value in same group:
DT[, g:=cumsum(c(1,diff(V2)!=0))]
#create sequences by groups
DT[, V3:=seq_len(.N)-1, by=g]
# V1 V2 g V3
#1: 1 1 1 0
#2: 2 1 1 1
#3: 3 2 2 0
#4: 4 2 2 1
#5: 5 2 2 2