【问题标题】:Storing a list within a data frame element in R在R中的数据框元素中存储列表
【发布时间】:2013-04-12 20:26:13
【问题描述】:

我想创建一个形式的数据结构

Start, End, Elements
  3  , 6  ,  {4,5}
  4 ,  10 ,  {7,8,9}
   ....

换句话说,我正在沿着一条线移动一个球。 “开始”代表球的最左边位置,“结束”代表最右边。 “元素”意味着我以某种方式发现这些职位很特别。当元素的数量可以变得非常大时,最好使用什么数据结构?我唯一能想到的是一个数据框,其中第三列是一个适当格式化的字符串。如果我想查看集合中的每个数字,我将不得不解析字符串。 R 是否有更好的数据格式?

谢谢!

【问题讨论】:

  • 实际上这很好用而且很容易实现。没有意识到数据框可以在里面存储一个列表。完美,谢谢
  • 为什么@joran 或 OP 都不将此作为答案发布?

标签: r data-structures


【解决方案1】:

我的评论中提到的选项,即简单地使用其中一列的列表:

dat <- data.frame(Start = 3:4, End = c(6,10))
> dat
  Start End
1     3   6
2     4  10
> dat$Elements <- list(4:5,7:9)
> dat
  Start End Elements
1     3   6     4, 5
2     4  10  7, 8, 9

您当然也可以完全放弃数据框,而只使用一个普通的旧列表(无论如何,这在很多情况下可能更有意义):

list(list(Start = 3,End = 6, Elements = 4:5),list(Start = 4,End = 10,Elements = 7:9))
[[1]]
[[1]]$Start
[1] 3

[[1]]$End
[1] 6

[[1]]$Elements
[1] 4 5


[[2]]
[[2]]$Start
[1] 4

[[2]]$End
[1] 10

[[2]]$Elements
[1] 7 8 9

【讨论】:

  • 如果您使用data.table,您可以在一行中完成所有操作:data.table(Start = 3:4, End = c(6,10), Elements = list(4:5, 7:9))
  • @eddi 是的,但是你必须使用 data.table。 :p
  • 不必, - 如果由我决定,就不会再有data.frame的:)
  • 或者,更直接地说:dat &lt;- data.frame(Start = 3:4, End = c(6,10), Elements = I(list(4:5, 7:9)))
【解决方案2】:

您可以将其存储为高数据框而不是宽数据框,并且可能使用data.table 来有效地处理它。也就是说,每个元素一行而不是每个起始对一行

library(data.table)
dt = data.table(Start=c(3, 3, 4, 4, 4), End=c(6, 6, 10, 10, 10), Elements=c(4, 5, 7, 8, 9))
#   Start End Elements
#1:     3   6        4
#2:     3   6        5
#3:     4  10        7
#4:     4  10        8
#5:     4  10        9

这将使您可以很容易地对数据进行多种处理,例如确定每个范围内有多少元素:

dt[, list(Num.Elements=length(Elements)), by=c("Start", "End")]

#    Start End Num.Elements
# 1:     3   6            2
# 2:     4  10            3

这也将使数据易于用于使用 ggplot 包的绘图,该包通常要求数据采用高格式。

您可能会注意到这种数据结构很浪费,因为它为每个元素重复开始和结束。但是,数据表的存储效率非常高——即使您的元素列表实际上是数百万长,它也可以很容易地适应并以这种方式进行处理。试试这样的一行:

dt = data.table(Start=1:1e6, End=1:1e6, Elements=1:1e6)

进行演示。 当然比将每个元素列表保存为一个字符串并每次都拆分它要快。

【讨论】:

  • 我没有意识到像上面提到的 joran 一样将其保存为列表是一种选择。现在我只是将它保存为一个数字元素列表,这很容易做到。不过感谢您的想法,在您提到之前,我什至没有考虑过长格式!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2020-09-02
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2014-12-12
相关资源
最近更新 更多