给出一个像:
这样的矢量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。
答案 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"
这是你需要的吗?