【问题标题】:Compare multiple vectors at the same time in R?在R中同时比较多个向量?
【发布时间】:2014-12-14 14:50:45
【问题描述】:

我可以很容易地比较 R 中的 2 个向量,看看有多少元素是相同的。 说

  a<- c(1,2,3,4)
  b<- c(1,2,3,5)
  sum(a==b) would give me what I want

但是如何比较 3 个向量?或同时超过 3 个向量?

  a<- c(1,2,3,4)
  b<- c(1,2,3,5)
  c<- c(2,3,4,5)
  sum(a==b & b==c) # does not seem to be correct

我正在寻找相同位置的元素是否相同。在同样的情况下,它会给我零,因为 a、b、c 在同一位置并不完全相同。

count = 0
for(i in 1:length(a)){
  if((a[i]==b[i]) & (a[i]==c[i]))
  count=count+1
} # this will give me that I want, but the efficiency seems very low 

【问题讨论】:

  • 您是否在寻找相同位置的元素是否相同?在这种情况下,比较 a、b、c 应该得到 0。例如 a &lt;- c(1,2,4,5); b &lt;- c(2,1,3,0) ; sum(a==b)#[1] 0
  • @akrun,感谢您指出这一点,这就是我的意思。

标签: r vector logical-operators


【解决方案1】:

创建matrixdata.frame 并检查column 之一是否等于其余的。

 m1 <- cbind(a,b,c)
 sum(rowSums(m1==m1[,1])==ncol(m1))
 #[1] 0

或者

 sum(Reduce(`&`,Map(`==`, list(a,b,c), list(a))))
 #[1] 0

如果要求共同元素的长度,

 length(Reduce(intersect,list(a,b,c)))
 #[1] 2

【讨论】:

  • @DavidArenburg 我正在尝试根据 OP 提供的数据逐个元素地进行比较。假设我更改c &lt;- c(1,3,2,4)。它会给1
  • @DavidArenburg 我对 OP 的描述和代码 sum(a==b) 感到困惑。
  • 对不起,我正在尝试比较有多少元素出现在 3 个向量中的同一位置。在问题中,它会给出 0。
  • @GeekCat 在这种情况下,第一个选项应该适合您。将所有向量保存在一个列表中并使用Reduce
【解决方案2】:
is.equal <- function(mylist) {

    check.eq <- sapply(mylist[-1], function(x) {x == mylist[[1]]})

    as.logical(apply(check.eq, 1, prod))                   

}

is.equal(list(c(1,2,3,4), c(1,2,5,4), c(1,1,3,4)))

[1]  TRUE FALSE FALSE  TRUE

【讨论】:

  • 它使用循环,因此在您可以找到的解决此问题的大多数解决方案中,它应该较慢。至少它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多