识别重复值并将其删除

时间:2017-12-22 15:00:39

标签: r diff shift

我有一个矢量:

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

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

例如,在上面的矢量中,5重复4次,因此我将保持前两个5'并使后两个5的NA。 同样,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)。

任何解决方案?

4 个答案:

答案 0 :(得分:2)

只有基本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

答案 1 :(得分:0)

我明白了。我只需要在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

答案 2 :(得分:0)

如果我的问题得到解决,我认为这可能有用:

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

我希望这有帮助!

答案 3 :(得分:0)

此问题可能涉及到您在数据帧而不是向量中遇到的问题。无论如何,这是解决这两种问题的最简单的方法。

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