R 引用data.table中的其他行
我有一个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
> 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)