不是迭代分配

时间:2014-03-10 13:46:48

标签: r data.table

我发现了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]
}

我不能做的是在矢量风格编程中进行转换。

感谢您的见解。

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