对大数据集中行的相对引用

Relative reference to rows in large data set

我有一个非常大的数据集(数百万行),当 var1 等于 "Z" 时,我需要将其中的某些行转换为 NA。但是,我还需要将前面的NA行变成var1="Z"行。 例如:

id  var1
1   A
1   B
1   Z
1   S
1   A
1   B
2   A
2   B
3   A
3   B
3   A
3   B
4   A
4   B
4   A
4   B

在这种情况下,id==1 的第二行和第三行应该是 NA。 我试过一个循环,但它不起作用,因为数据集非常大。

for (i in 1:length(df$var1)){
        if(df$var1[i] =="Z"){
                df[i,] <- NA
                df[(i-1),] <-- NA
        }
}

我也尝试过使用 data.table 包失败。您是否知道我该怎么做,或者查找有关我正在尝试做的事情的信息的正确术语是什么?

你可以有一个基础 R 方法:

x = var1=='Z'
df[x | c(x[-1],F), 'var1'] <- NA

#   id var1
#1   1    A
#2   1 <NA>
#3   1 <NA>
#4   1    S
#5   1    A
#6   1    B
#7   2    A
#8   2    B
#9   3    A
#10  3    B
#11  3    A
#12  3    B
#13  4    A
#14  4    B
#15  4    A
#16  4    B

也许可以这样使用 data.table:

df <- as.data.table(read.table(header=T, file='clipboard'))
df$var1 <- as.character(df$var1)

#find where var1 == Z
index <- df[, which(var1 == 'Z')]
#add the previous lines too
index <- c(index, index-1)
#convert to NA
df[index, var1 := NA  ]

或一次调用:

df[c(which(var1 == 'Z'), which(var1 == 'Z') - 1), var1 := NA  ]

输出:

> df
    id var1
 1:  1    A
 2:  1   NA
 3:  1   NA
 4:  1    S
 5:  1    A
 6:  1    B
 7:  2    A
 8:  2    B
 9:  3    A
10:  3    B
11:  3    A
12:  3    B
13:  4    A
14:  4    B
15:  4    A
16:  4    B

如果你只想计算来自相同 id 的前面的索引,我建议使用 .Iby 组合,这将确保你没有从以前的 id

中引用
setDT(df)[, var1 := as.character(var1)]
indx <- df[, {indx <- which(var1 == "Z") ; .I[c(indx - 1L, indx)]}, by = id]$V1
df[indx, var1 := NA_character_]
df

#     id var1
#  1:  1    A
#  2:  1   NA
#  3:  1   NA
#  4:  1    S
#  5:  1    A
#  6:  1    B
#  7:  2    A
#  8:  2    B
#  9:  3    A
# 10:  3    B
# 11:  3    A
# 12:  3    B
# 13:  4    A
# 14:  4    B
# 15:  4    A
# 16:  4    B