【问题标题】:Test if all elements of a list (lists themselves) are equal测试列表的所有元素(列表本身)是否相等
【发布时间】:2013-12-15 17:33:48
【问题描述】:

我有一个list 列表,并想检查此list(属于list 类型)的所有元素是否相同。如何以最快的方式实现它?

更新:我在下面放了一个可重现的示例。关键是要获得这样一个测试的FALSE 值,因为eventual.list 的两个元素是不同的:eventual.list[[1]][[1]] data.frame 具有除eventual.list[[2]][[1]] 之外的其他值data.frame

代码:

a <- 1:3
b <- 1:3
c <- 2:4

l1.el1 <- data.frame(a, b)
l1.el2 <- a
l1 <- list(l1.el1,
           l1.el2)

l2.el1 <- data.frame(a, c)
l2.el2 <- a
l2 <- list(l2.el1,
           l2.el2)

eventual.list <- list(l1,
                      l2)
eventual.list

控制台输出:

> eventual.list
[[1]]
[[1]][[1]]
  a b
1 1 1
2 2 2
3 3 3

[[1]][[2]]
[1] 1 2 3


[[2]]
[[2]][[1]]
  a c
1 1 2
2 2 3
3 3 4

[[2]][[2]]
[1] 1 2 3

【问题讨论】:

  • 你能提供一个最小的例子吗?例如,列表是否仅包含单个数值或向量或其他类型的对象?
  • 您好,感谢您的关注!是的,元素列表应该包含不同类型的对象,例如数据框、向量等(参见我提供的示例)。

标签: r list


【解决方案1】:

这是确定列表中所有项目是否相同的规范方法:

length(unique(object))==1

在你的情况下:

> length( unique( eventual.list ) )
[1] 2

> length( unique( eventual.list ) ) == 1
[1] FALSE

unique 的帮助页面可能会让人们认为列表不会被处理,直到有人反映这个结果,当我第一次遇到它时让我感到惊讶:

 is.vector( eventual.list ) 
[1] TRUE

所以列表在 R 语言中是技术上的向量,它们只是不是“原子”向量,它们是“递归的”。

>  is.atomic(eventual.list)
[1] FALSE
> is.recursive(eventual.list)
[1] TRUE

【讨论】:

  • 这是个好主意。半小时都在为此头疼
  • 我想,刹车比摔断或撞到头要少一些暴力。
猜你喜欢
  • 2015-09-14
  • 2013-09-19
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多