测试列表中所有成员之间的相等性

时间:2015-12-16 13:34:48

标签: r list

检查列表中所有成员之间的相等性的正确语法是什么?我找到了

do.call(all.equal, list(1,2,3))

返回TRUE

我的预感是它检查列表元素内的相等性,而不是在。

之间

理想情况下,解决方案会忽略元素的名称,但不会忽略元素组件的名称。例如,给定输入它应该返回TRUE:

some_list <- list(foo = data.frame(a=1),
                  bar = data.frame(a=1))

但输入时为FALSE:

some_other_list <- list(foo = data.frame(a=1),
                        bar = data.frame(x=1))

但我可以使用对元素名称敏感的解决方案。

修改:显然,我需要审核?funprog。作为接受答案的后续行动,值得注意以下行为:

Reduce(all.equal, some_list)  # returns TRUE

Reduce(all.equal, some_other_list) #returns [1] "Names: 1 string mismatch"

并且:

yet_another_list <- list(foo = data.frame(a=1),
                        bar = data.frame(x=2))
Reduce(all.equal, yet_another_list)
# returns: [1] "Names: 1 string mismatch"     "Component 1: Mean relative difference: 1"

编辑2:我的示例不充分,Reduce在3个或更多元素的情况下不起作用:

some_fourth_list <- list(foo = data.frame(a=1),
                  bar = data.frame(a=1),
                  baz = data.frame(a=1))
Reduce(all.equal, some_fourth_list) # doesn't return TRUE

2 个答案:

答案 0 :(得分:5)

1)如果该列表中只包含两个问题,请尝试以下方法:

identical(some_list[[1]], some_list[[2]])
## [1] TRUE

2)或对于包含任意数量组件的一般方法,请尝试以下方法:

all(sapply(some_list, identical, some_list[[1]]))
## [1] TRUE

L <- list(1, 2, 3)
all(sapply(L, identical, L[[1]]))
## [1] FALSE

3)减少与先前的解决方案相比,这有点冗长,但由于讨论了Reduce,这就是它的实现方式:

Reduce(function(x, y) x && identical(y, some_list[[1]]), init = TRUE, some_list)
## [1] TRUE

Reduce(function(x, y) x && identical(y, L[[1]]), init = TRUE, L)
## [1] FALSE

答案 1 :(得分:0)

这个怎么样:

identical(unlist(some_list), unlist(some_other_list))