我有一个多个向量的列表。我想检查列表中的所有向量是否相等。有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)
字符串
有什么建议吗?除了两两比较之外,有没有别的本地检查相同的方法?
6条答案
按热度按时间a1o7rhls1#
怎么样
字符串
正如@JoshuaUlrich在下面指出的,
unique
在列表中可能很慢。而且,identical
和unique
可能使用不同的标准。Reduce
是我最近学习的一个函数,用于扩展成对运算:型
这种方法在发现一个不匹配项后继续进行比较,效率很低。我的粗略解决方案是编写
else break
而不是else FALSE
,从而引发错误。gwo2fgha2#
我会做:
字符串
vd2z7a6w3#
总结解决方案。测试数据:
字符串
解决方案:
型
数据检验:
型
基准:
型
正如我们所看到的,最有效的解决方案基于
duplicated
和unique
函数。yvgpqqbh4#
我对
cgwtools::approxeq
的自我推销建议,它本质上做了all.equal
做的事情,但返回一个逻辑值的向量,指示是否相等。所以:取决于你想要精确相等还是浮点表示相等。
u4vypkhs5#
更新
整体最佳解决方案:
字符串
用一个中断来实现Frank的解决方案:
型
继续阿尔特姆的基准测试,并添加Jake评论中的解决方案,速度很大程度上取决于所比较的对象,但
all.identical.list
始终是最快的(或非常接近最快):型
zynd9foi6#
这也适用
字符串