假设一个向量:
vec = c(NA,NA,1,NA,NA,NA,1,NA,NA,0,NA,NA,0,NA,NA,0,NA,NA,1,NA,NA,1,NA,NA,0,NA,0)
Run Code Online (Sandbox Code Playgroud)
我想得到:
vec = c(NA,NA,1,NA,NA,NA,NA,NA,NA,0,NA,NA,NA,NA,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,0,NA,NA)
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 if 来检查该值是否等于之前的非 NA 的 for 循环,但是当重复多次时它不起作用。
将向量中的重复项删除到下一个值 也不起作用,因为我想保留我的 NA。
您可以通过一点逻辑和复合[与[<-运算来完成此操作。首先我们需要找到重复项。diff()我们将对所有非值执行此操作NA......
diff( vec[ ! is.na( vec ) ]
[1] 0 -1 0 0 1 0 -1 0
Run Code Online (Sandbox Code Playgroud)
每个0都是重复的。现在我们需要找到它们的位置vec并将它们设置为NA..
# This gives us a vector of TRUE/FALSE values which we will use to subset vec to the values we want to change
dups <- c( 1 , diff( vec[ ! is.na( vec ) ] ) ) == 0
# Now subset vec to non NA values and change the duplicates to NA
vec[ ! is.na( vec ) ][ dups ] <- NA
# [1] NA NA 1 NA NA NA NA NA NA NA NA 0 NA NA NA NA NA NA NA NA NA 1 NA NA NA
#[26] NA NA 0 NA NA
Run Code Online (Sandbox Code Playgroud)