【问题标题】:lapply on a list of list not working in Rlapply 在不在 R 中工作的列表列表上
【发布时间】:2018-04-06 03:48:09
【问题描述】:

我有

typeof(A)
>"list"
typeof(A[1])
>"list"
typeof(A[[1]])
>"double"

当我跑步时

A=lapply(A,unlist)
typeof(A[1])
>"list"

结果似乎是一样的。然而,如果我跑了

B=unlist(A[1])
typeof(B)
"double"

请帮助我理解这种行为。为什么两者有区别? lapply 不应该将该函数应用于列表的每个元素吗?比 A[i] 应该像 B 吗?

【问题讨论】:

  • 如果A 是一个列表,那么A[1] 将自动成为一个列表。这并不意味着您正在处理列表列表。另一方面,如果typeof(A[[1]]) 返回“列表”,那么我们会。函数lapply 应该被认为是A[[i]] 的循环,其中i1:length(A) 的范围。注意:我没有说完A[i]
  • @42- 我明白了,如果 A 是一个列表,那么 A[i] 总是一个列表......我不知道这一点。所以我其实没有列表列表,而是向量列表?您能否详细说明为什么 A[i] 总是一个列表?如果你愿意,我会接受你的回答。谢谢
  • 应用于列表的“[”函数总是返回一个子列表。子列表仍然是列表。如果长度 A == 1 则 A[1] == A 以丢失属性的可能性为模,并以 == 运算符不接受这些作为参数的事实为模。

标签: r


【解决方案1】:

lapply 实际上返回一个列表作为其输出。它将一个函数应用于多个元素,并将每个输出作为列表的一个元素返回。

对于它的价值,A[[1]] 是 double 类型实际上告诉你你有一个 double 列表。 [[ ]] 引用列表的元素,[] 引用向量的元素。因此,通过请求A[1],您将获得第一个元素作为列表,通过请求A[[1]],您将获得第一个被删除的元素。

我怀疑你想要的只是unlist(A)。这会将 A 的每个元素作为单个向量中的元素返回。在您的情况下, A 是双打列表。所以希望这就是你想要的。

举个例子

test = list(list(5), list(3), list(1))
> test #Notice this is a list of lists, each containing one element
[[1]]
[[1]][[1]]
[1] 5


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


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

> test[2] #Notice this has exported the second element as a new list with one element
[[1]]
[[1]][[1]]
[1] 3

> test[[2]] #Notice this has exported the second element not as a list, so now we have one listed instead of two nested lists.
[[1]]
[1] 3

lapply(test, unlist) #This returns a list of element rather than a list of lists
[[1]]
[1] 5

[[2]]
[1] 3

[[3]]
[1] 1

unlist(lapply(test, unlist)) #This returns a vector of elements by unlisting the list of elements we created in the previous step
[1] 5 3 1

我希望这能消除一些行为:)

【讨论】:

  • 感谢您的回复。我有一个列表,其中每个元素都是一个列表,里面有一个向量。我想得到一个带有向量的列表。所以 A 仍然是一个列表,但它的元素不是包含向量的列表,而是向量。如果我不列出(A),我只会得到一个长向量。
  • 那你要unlist(lapply(A,unlist))吗?因此,您取消列出每个元素以获取元素列表,然后取消列出该元素列表?
  • 如果 A 是 list(B=1:10, C=10:29),那么我认为您对 unlist 的描述无法清楚地描述 unlist(A) 将返回的内容。
  • @42,我同意你的看法。 OP 声明他的列表只包含一个元素,所以我在这个场合一直很具体。
  • @LeastSquaresWonderer 我已经更新了我的解决方案。也许这更清楚了一些事情?
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2021-07-02
  • 1970-01-01
  • 2020-06-05
相关资源
最近更新 更多