繁体   English   中英

引用data.table中的另一行

[英]Referencing to other row in 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]

任何帮助,将不胜感激,谢谢。

使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM