我有一个具有以下结构的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]
谢谢您的任何帮助。
答案 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)