在R中同时比较多个向量?

5
我可以轻松比较 R 中的两个向量,以查看有多少元素是相同的。例如:
  a<- c(1,2,3,4)
  b<- c(1,2,3,5)
  sum(a==b) would give me what I want

但是我怎样才能比较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 <- c(1,2,4,5); b <- c(2,1,3,0) ; sum(a==b)#[1] 0 - akrun
@akrun,感谢你指出来,那正是我的意思。 - GeekCat
2个回答

7
创建一个矩阵或数据框,并检查其中一列是否与其他列相等。
 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 <- c(1,3,2,4)。它会给出1 - akrun
@DavidArenburg 我被提问者的描述和代码 sum(a==b) 搞糊涂了。 - akrun
抱歉造成困惑,我正在尝试比较3个向量在相同位置出现的元素数量。在这个问题中,答案将会是0。 - GeekCat
@GeekCat 如果是这样的话,第一种选项应该适合你。将所有向量保存在列表中,并使用Reduce函数。 - akrun

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

它使用循环,因此它应该比大多数你可以找到的解决方案慢。至少它能够工作。 - Davide Passaretti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接