可能有更聪明的方法来解决这个问题,但是
intersect(intersect(a,b),c)
将完成这项工作。
编辑:如果你有很多争论,更聪明,更方便:
Reduce(intersect, list(a,b,c))
已经是一个很好的答案,但是还有其他几种方法可以做到这一点:
unique(c[c%in%a[a%in%b]])
或者,
tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]
如果您知道 a
、b
或 c
中没有重复值,您显然可以省略 unique
调用。
intersect_all <- function(a,b,...){
all_data <- c(a,b,...)
require(plyr)
count_data<- length(list(a,b,...))
freq_dist <- count(all_data)
intersect_data <- freq_dist[which(freq_dist$freq==count_data),"x"]
intersect_data
}
intersect_all(a,b,c)
更新编辑更简单的代码
intersect_all <- function(a,b,...){
Reduce(intersect, list(a,b,...))
}
intersect_all(a,b,c)
不定期副业成功案例分享
Reduce
和正确的 R 大写!intersect
用于集合操作。如果向量中有重复出现的元素,您将丢失此信息,因为向量在相交之前已转换为集合。例如,intersect(c(1,1,2,3), c(1,1,3,4))
会产生c(1,3)
,而您可能想要结果c(1,1,3)
。N <- max(unlist(L)); LT <- lapply(L, tabulate, nbins = N); v <- do.call(pmin, LT); unlist(sapply(1:N, function(x) rep(x, v[x])))
另一种方法是使用match
函数以及负下标来迭代从每个向量中删除添加到“内核”的每个元素。