我有几个向量的列表。我想检查列表中的所有向量是否相等。 identical仅适用于成对比较。所以我写了下面的函数,对我来说看起来很丑。我仍然没有找到更好的解决方案。这是我的RE:

test_true <- list(a=c(1,2,3),b=c(1,2,3),d=c(1,2,3))
test_false <- list(a=c(1,2,3),b=c(1,2,3),d=c(1,32,13))

compareList <- function(li){
  stopifnot(length(li) > 1)
  l <- length(li)
  res <- lapply(li[-1],function(X,x) identical(X,x),x=li[[1]])
  res <- all(unlist(res))
  res
}

compareList(test_true)
compareList(test_false)


有什么建议?是否有本机检查是否完全相同,而不仅仅是成对比较?

最佳答案

怎么样

allSame <- function(x) length(unique(x)) == 1

allSame(test_true)
# [1] TRUE
allSame(test_false)
# [1] FALSE


正如@JoshuaUlrich在下面指出的那样,unique在列表上可能会变慢。此外,identicalunique可以使用不同的条件。 Reduce是我最近了解的用于扩展成对运算的功能:

identicalValue <- function(x,y) if (identical(x,y)) x else FALSE
Reduce(identicalValue,test_true)
# [1] 1 2 3
Reduce(identicalValue,test_false)
# [1] FALSE


在找到一个不匹配项之后,这会继续低效地进行比较。我对此的粗略解决方案是写else break而不是else FALSE并引发错误。

08-26 22:07
查看更多