检测向量中的第n个重复(和第n + 1,......)

时间:2016-05-05 07:13:17

标签: r

给出一个像:

这样的矢量
x <- c("r", "r", "b", "b", "b", "b", "r", "r", "y", "y")

如何检测代表(至少)第n个重复值的元素?

对于这种情况,如果我们不想要两个以上的重复,这应该给出:

duplicatedN(x, 2)
# F, F, F, F, T, T, T, T, F, F

换句话说:如果至少N个前面的元素具有相同的值i,则值v的元素v应标记为TRUE。

2 个答案:

答案 0 :(得分:4)

使用data.table的可能解决方案:

library(data.table)

duplicatedN <- function(x,n=2){
  DT <- data.table(A=x)
  DT[,dup:=1:.N > n,by=A]
  return(DT$dup)
}

x <- c("r", "r", "b", "b", "b", "b", "r", "r", "y", "y")

> duplicatedN(x,1)
 [1] FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
> duplicatedN(x,2)
 [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
> duplicatedN(x,3)
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE
> duplicatedN(x,4)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

答案 1 :(得分:1)

围绕table的此解决方案完成了这项工作:

如果要返回逻辑:

duplicateN <- function(x, n){
  x %in% names(which(table(x) >= n))
}

> duplicateN(x, 3)
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

或者,如果您直接想要返回实际元素:

atleastN <- function(x, n){
  x[x %in% names(which(table(x) >= n))]
}

# x[duplicateN(x, n)] would also work

> atleastN(x, 3)
[1] "r" "r" "b" "b" "b" "b" "r" "r"

这是你需要的吗?

相关问题