在R中的数据框元素中存储列表

use*_*015 10 r data-structures

我想以形式创建数据结构

Start, End, Elements
  3  , 6  ,  {4,5}
  4 ,  10 ,  {7,8,9}
   ....
Run Code Online (Sandbox Code Playgroud)

换句话说,我正在沿着一条线移动一个球."开始"代表球的最左侧位置,"结束"代表最右侧."元素"意味着我以某种方式找到那些特殊的位置.当元素数量增长非常大时,使用哪种最佳数据结构?我唯一能想到的是一个数据框,其中第3列是一个适当格式化的字符串.如果我想查看集合中的每个数字,我将不得不解析字符串.R有没有更好的数据格式或者是关于它的数据格式?

谢谢!

jor*_*ran 12

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 或者,更直接:`dat < - data.frame(Start = 3:4,End = c(6,10),Elements = I(list(4:5,7:9))) (6认同)
  • 没有,**得到** - 如果由我决定,将不再有`data.frame`的:) (4认同)
  • 如果你使用`data.table`,你可以在一行上完成:`data.table(Start = 3:4,End = c(6,10),Elements = list(4:5,7: 9))` (2认同)
  • @eddi是的,但是你必须使用**data.table**.:p (2认同)

Dav*_*son 7

您可以将其存储为高数据框而不是宽数据框,并可能使用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
Run Code Online (Sandbox Code Playgroud)

这样您就可以非常轻松地对数据进行多种处理,例如确定每个范围中的元素数量:

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

#    Start End Num.Elements
# 1:     3   6            2
# 2:     4  10            3
Run Code Online (Sandbox Code Playgroud)

这也可以使数据易于用于使用ggplot包的图,这通常期望数据是高格式的.

您可能会注意到,此数据结构会浪费,因为它会为每个元素重复开始和结束.但是,数据表的存储效率非常高 - 即使您的元素列表长达数百万,它也可以轻松地适应并以这种方式处理.尝试一下这样的一行:

dt = data.table(Start=1:1e6, End=1:1e6, Elements=1:1e6)
Run Code Online (Sandbox Code Playgroud)

用于演示.处理它肯定比将每个元素列表保持为字符串并每次拆分它更快.