识别重复值并删除它们
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)
我有一个向量:
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
中将参数更改为 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
如果我解决了你的问题,我认为这可能有效:
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)