如何将一个列表的列表转换为一个列表的数组?

3

我在R中有一个列表的列表。我想将其转换为一个列表数组,但我只得到了一个列表的列表数组:

r <- list(list(a=1, b=NULL, c=NULL, d=1.23),
          list(a=2, b=NULL, c=NULL, d=3.32),
          list(a=3, b=NULL, c=NULL, d=2.13),
          list(a=4, b=NULL, c=NULL, d=3.25),
          list(a=5, b=NULL, c=NULL, d=0.14),
          list(a=6, b=NULL, c=NULL, d=5.13))
x <- array(r, dim=c(3,2))
x[1,1] # now a list of length 1 containing an element which is a list with components a--d

如您所见,x[1,1](例如)现在是一个列表的列表,但“外部”列表是无用的。我更想要一个数组y,其中y[i,j]x[i,j][[1]]。有什么最好的方法可以实现这一点(使用基本的R函数(无需额外包))?
我尝试使用一些unlist()技巧,如array(unlist(r, recursive=FALSE), dim=c(3,2)),但失败了。sapply(r, FUN=I)至少给出了一个矩阵...也许那会有所帮助(?)
2个回答

5
使用双括号,x[[1,1]]

这相当于 x[1,1][[1]],而这正是提问者想要避免使用的。 - Theodore Lytras
显然,但听起来OP想避免输入3个索引和额外的括号的不便。 - Matthew Plourde
非常感谢,Matthew和Theodore,这解释了很多。 - Marius Hofert

1

这是设计上的限制,你无法这样做。

向量元素在定义上是长度为1的向量,而数组/矩阵仍然是具有维度的向量。

列表本身是通用向量,因此它们可以是其他列表(或数组、矩阵)的元素,但前提是它们本身的长度为1。

顺便说一下,这就是为什么使用 [ ] 选择列表中包含的对象只返回一个大小为1的列表,其中包含该对象,而不是实际的对象,需要使用 [[ ]] 来获取。

所以答案是,没有办法摆脱“外部”列表。

有关详细信息,请参阅R语言定义手册。


-1 [[ 可以与 arraylist 一起使用,因此有一种方法。此外,长度为零的 list 当然可以是其他 listarray 的元素。 - Matthew Plourde
@MatthewPlourde [[[ 都是通用的,可以与各种类一起使用,这并不意味着什么。有关详细信息,请参阅 ?Extract。此外,如果 a <- list(list(), list()),那么 a[1] 仍然返回一个长度为一的列表,其中包含一个空列表,而 a[[1]] 返回实际的空列表。这表明向量(或列表、数组等)元素默认情况下大小为1,它们可能反过来包含其他类型的对象。 - Theodore Lytras
当然,[[[ 是通用的。我不明白你在第一句话中想表达什么意思。关于 list 元素的长度,你是正确的,但这是一个微妙的问题,你可以在你的回答中更清楚地阐述。 - Matthew Plourde

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