引用data.table中的另一行

时间:2018-10-13 15:37:03

标签: r data.table

我有一个具有以下结构的data.table:

> head(DF)
                                         X X00000001 Rit
1: %100,11410,      ,001,002,Nachtnettrein         1   1
2: %100,01412,      ,002,007,Nachtnettrein         0   0
3:                          -00002,000,999         0   0
4:                           &IC  ,001,007         0   0
5:                           >rtd    ,2532         0   0
6:                      ?11   ,11   ,00002         0   0

当X00000001列等于0时,“ Rit”列应采用相邻X00000001列的值。当X00000001列== 0时,它应采用“ Rit” -1列(上一行)的值。当我仍然使用以下数据框时,我能够做到这一点:

for(i in nrow(DF)) {

  ifelse(DF$X00000001[i] == 0, DF$Rit[i] <- DF$Rit[i-1], DF$Rit[i] <- DF$X00000001[i])
}

但是因为它是一个大数据集,所以我不得不转换为data.table。尽管上面的方法仍然有效,但是它非常缓慢。我试图四处寻找实现此目的的data.table方法,并得出以下结论:

  DF[X00000001 == 0, Rit := 2]
  DF[X00000001 != 0, Rit := X00000001]

!= 0的大小写就可以了。在== 0的情况下,我使用2作为虚拟变量,它工作得很好。事实是,我希望它采用2之前的行的值,而不是2。用伪代码是这样的:

  DF[X00000001 == 0, Rit := Rit[n-1]
  DF[X00000001 != 0, Rit := X00000001]

谢谢您的任何帮助。

1 个答案:

答案 0 :(得分:2)

使用dplyr

df %>%
  mutate(Rit = ifelse(X00000001 != 0, X00000001,
                    ifelse(X00000001 == 0, lag(Rit), NA)))

或使用data.table

setDT(df)
df[, Rit := ifelse(X00000001 != 0, X00000001,
                   ifelse(X00000001 == 0, shift(Rit, 1, type = "lag"), NA))]

数据:

  df <- read.table(text = "X00000001 Rit
1   1
0   0
0   0
0   0
0   0
0   0", header = TRUE)