删除本地重复值

Reu*_*hew 3 r

如果您有这样的数据框:

v <- c(1, 1, 5, 5, 2, 2, 6, 6, 1, 2, 2, 2, 2, 2, 2, 3)
w <- data.frame(v)
Run Code Online (Sandbox Code Playgroud)

如何删除重复值w并将其替换为NA仅在值之后立即重复的值,以便新数据框如下所示?

v <- c(1, NA, 5, NA, 2, NA, 6, NA, 1, 2, NA, NA, NA, NA, NA, 3)
w <- data.frame(v)
Run Code Online (Sandbox Code Playgroud)

注意2连续出现两次并且每次出现时都会保留,并且立即重复的值都被删除了吗?

我搜索了SO,我看到了使用独特和重复的功能删除每个重复值的响应,但这不是我正在搜索的内容.我希望R中有一个包可以在不使用函数的情况下执行此操作.

S. *_*ica 6

关键是检查差异使用diff()和填充NA差异为零时:

> result <- v
> result[c(FALSE,diff(v)==0)] <- NA
> result
 [1]  1 NA  5 NA  2 NA  6 NA  1  2 NA NA NA NA NA  3
> 
Run Code Online (Sandbox Code Playgroud)


tal*_*lat 5

或者简单ifelse:

ifelse(lag(v,1) == v & !is.na(lag(v,1)), NA, v)
#[1]  1 NA  5 NA  2 NA  6 NA  1  2 NA NA NA NA NA  3
Run Code Online (Sandbox Code Playgroud)

编辑:如果原始矢量包含NA,最好使用dplyr::lag而不是stats::lag.