【问题标题】:How to find common elements from multiple vectors?如何从多个向量中找到共同元素?
【发布时间】:2011-04-11 08:59:21
【问题描述】:

谁能告诉我如何从多个向量中找到共同的元素?

a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)

我想从上面的向量中得到共同的元素(例如:3和9)

【问题讨论】:

  • 使用c作为变量名不是个好主意...
  • 为什么和别人一样是字母?
  • @DimitriPetrenko 因为您可以使用c(1,2...) 声明列表。

标签: r vector r-faq


【解决方案1】:

可能有更聪明的方法来解决这个问题,但是

intersect(intersect(a,b),c)

会做的。

编辑:如果你有很多论点,更聪明,更方便:

Reduce(intersect, list(a,b,c))

【讨论】:

  • +1 提醒我们注意 Reduce 和正确的 R 大写!
  • 值得注意的是intersect是用于集合操作的。如果向量中有重复出现的元素,您将丢失此信息,因为向量在相交之前已转换为集合。例如。 intersect(c(1,1,2,3), c(1,1,3,4)) 会产生 c(1,3),而您可能想要结果 c(1,1,3)
  • @GioraSimchoni 如果这真的是你想要的,你怎么能得到 c(1,1,3)?
  • @StatsSorceress 假设您想要由正整数组成的向量的“交集保留重复项”,全部在列表 L 中。以下代码有效:N &lt;- max(unlist(L)); LT &lt;- lapply(L, tabulate, nbins = N); v &lt;- do.call(pmin, LT); unlist(sapply(1:N, function(x) rep(x, v[x]))) 另一种方法是使用 @987654329 @ 函数以及负下标迭代地从每个向量中删除每个添加到“内核”的元素。
【解决方案2】:

已经是一个很好的答案,但还有其他几种方法可以做到这一点:

unique(c[c%in%a[a%in%b]])

或者,

tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]

如果您知道abc 中没有重复值,您显然可以省略unique 调用。

【讨论】:

  • 如何在单个数据框中找到跨不同列的共同元素元素是数字我尝试了 reduce 函数没有输出我尝试将它们转换为因子仍然没有答案但是如果我尝试通过例如 intersect (df$a,df$b) 等工作..因为我总共有 40 列它很麻烦...你能建议一些更短的内容吗
【解决方案3】:
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)

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 2014-11-28
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多