我有一个矢量:
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)。
任何解决方案?
答案 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
中将参数更改为2vec <- 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)