Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 引用data.table中的其他行_R_Data.table - Fatal编程技术网

R 引用data.table中的其他行

R 引用data.table中的其他行,r,data.table,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

我有一个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])
}
那个!=0箱工作正常。在==0的情况下,我使用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)))
或者使用
数据。表

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


df您非常接近,使用
df[,Rit:=shift(X00000001,fill=NA)][X00000001!=0,Rit:=X00000001][]
应该可以得到您想要的结果。谢谢,这几乎可以实现。对于这两个函数,我遇到的问题是,如果我运行它,它一次只更新一行。所以我运行它,它进入第二排;再次运行它,它进入第三行,等等。我能够让它对前100个值进行一个小的重复循环(作为测试)。但这真的很慢。我是否遗漏了什么,或者有更好的解决方法吗?我不完全确定我是否理解你问题的本质。你能详细解释一下吗?这是我在数据上的一个错误。它现在起作用了。
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)