识别重复值并删除它们

Identify duplicate values and remove them

我有一个向量:

vec <- c(2,3,5,5,5,5,6,1,9,4,4,4)

我想检查一个特定值是否连续重复,如果是,保留前两个值并将 NA 分配给其余值。

例如,在上面的向量中,5 重复了 4 次,因此我将保留前两个 5,并使后两个 5 不适用。 同样,4重复了三次,所以我会保留前两个4,去掉第三个。

最后我的矢量应该是这样的:

2,3,5,5,NA,NA,6,1,9,4,4,NA

我这样做了:

bad.values <- vec - binhf::shift(vec, 1, dir="right") 
bad.repeat <- bad.values == 0

vec[bad.repeat] <- NA

[1]  2  3  5 NA NA NA  6  1  9  4 NA NA

我只能让它工作以保留前 5 和 4(而不是前两个 5 或 4',4)。

有什么解决办法吗?

我明白了。我只需要在 binhf::shift

中将参数更改为 2
vec <- c(2,3,5,5,5,5,6,1,9,4,4,4)
bad.values <- vec - binhf::shift(vec, 2, dir="right") 
bad.repeat <- bad.values == 0
vec[bad.repeat] <- NA

[1]  2  3  5  5 NA NA  6  1  9  4  4 NA

如果我解决了你的问题,我认为这可能有效:

vec <- c(2,3,5,5,5,5,6,1,9,4,4,4)
diffs1<-vec-binhf::shift(vec,1,dir="right")
diffs2<-vec-binhf::shift(vec,2,dir="right")
get_zeros<-abs(diffs1)+abs(diffs2)
vec[which(get_zeros==0)]<-NA

希望对您有所帮助!

仅具有基本 R 函数的另一个选项:

rl <- rle(vec)

i <- unlist(lapply(rl$lengths, function(l) if (l > 2) c(FALSE,FALSE,rep(TRUE, l - 2)) else rep(FALSE, l)))

vec * NA^i

给出:

  [1]  2  3  5  5 NA NA  6  1  9  4  4 NA

这个问题可能是指你在数据帧中遇到的问题,而不是向量。无论如何,这里有一个 tidyverse 解决方案。

tibble(x = vec) %>% 
  group_by(x) %>%   
  mutate(mycol = ifelse(row_number()>2, NA, x) ) %>% 
  pull(mycol)