【问题标题】:How best to remove an extra "layer of lists" in R?如何最好地删除 R 中额外的“列表层”?
【发布时间】:2014-11-12 19:14:11
【问题描述】:

我有一个包含 1 个数据框的列表,如下例所示:

> t
[[1]]
  y1 y2
1  1  4
2  2  5
3  3  6

[[2]]
  y1 y2
1  3  6
2  2  5
3  1  4

这当然会给我这样的结果:

> class(t[1])
[1] "list"
> class(t[[1]])
[1] "data.frame"

也许我用错了 R,但这让我很恼火。我宁愿只有一个数据框列表。这样,我可以将每个人称为t[i],而不是笨拙的t[[i]]。将其转换为数据框列表的最佳方法是什么?

我是不是离基地太远了? R 似乎很喜欢给我这些单例列表。

提前感谢您的帮助和耐心。

【问题讨论】:

  • 尝试使用t[[i]] 而不是t[i]。 (并仔细阅读help("[") 中关于"Recursive (list-like) objects" 的部分,了解此设置中[[[ 之间的区别。)
  • 谢谢!我想我理解其中的区别——我只是希望将对象转换为可以使用[ 的对象。如果所有列表都是单例的,那么将其保留为当前形式是否会获得任何优势?这让我很困惑。
  • 我的建议是,当您想要提取一个列表元素(而不是由该元素组成的长度为一的列表)的内容时,您只需学会使用[[。 FTR,让[ 表现得如此的优势在于它允许您获取列表的任意子集(t[1:4]t[1]t[-5]t[c(1,1,1,2,2)])。
  • 我宁愿只有一个数据框列表。,但你确实有一个数据框列表...看看here 以获得一些有趣的信息关于列表
  • 投票结束。这本质上是要求 R 成为一种不同的语言。

标签: r list


【解决方案1】:

您已经有一个数据框列表,不能再做任何事情(除了行绑定它们以生成单个数据框)。尝试阅读the subsetting chapter in the Advanced R book

简述

R 有 3 种主要子集方法,[[[$。它们的行为取决于您使用它们的对象。 (@ 比较少见,用于 S4 对象。)

一般来说,[ 子集返回您之前拥有的同一对象的子集。例如,(1:5)[4] 从长度为 5 的向量返回长度为 1 的向量。 [[ 子集不一定返回对象的一部分,但可能与您所拥有的类型相同。对于向量,它与[ 的作用相同。

由于列表通常包含不同类型的对象,[[[ 之间的区别可能很重要。 [ 子集为您提供一个仅包含指定元素的新列表,而 [[ 直接为您提供元素。请注意,数据框是列表。 iris[1] 返回一个只有第一列的数据框。 iris[[1]] 返回一个向量,即来自iris 数据框的第一个对象。

$ 只是[[ 的同义词,允许自动完成。

[[[ 之间的区别对于某些对象可能不明显。例如,iris[[c(1, 2)]]iris[2, 1] 的作用相同。第一个似乎选择对象 1,然后选择对象 2。第二个选择第 1 列中的第 2 行。

【讨论】:

    猜你喜欢
    • 2017-10-10
    • 2014-01-13
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多