删除向量中的重复项但保留顺序

use*_*466 3 r vector

假设一个向量:

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。

Sim*_*lon 5

您可以通过一点逻辑和复合[[<-运算来完成此操作。首先我们需要找到重复项。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)

  • 我非常缺乏 R 中向量操作的逻辑,谢谢你的解释。 (3认同)