首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中的数据帧元素内存储列表

在R中的数据帧元素内存储列表
EN

Stack Overflow用户
提问于 2013-04-13 04:26:14
回答 2查看 22K关注 0票数 13

我想创建一个数据结构,其形式为

代码语言:javascript
复制
Start, End, Elements
  3  , 6  ,  {4,5}
  4 ,  10 ,  {7,8,9}
   ....

换句话说,我正在沿着一条线移动一个球。“开始”表示球最左边的位置,“结束”表示最右边的位置。"Elements“意思是,不知何故,我发现这些位置很特别。当元素的数量可能变得非常大时,最好的数据结构是什么?我能想到的唯一一件事就是数据框,其中第三列是一个适当格式化的字符串。然后,如果我想要查看集合中的每个数字,我就必须解析字符串。R有没有更好的数据格式?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-13 05:27:05

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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
票数 15
EN

Stack Overflow用户

发布于 2013-04-13 04:36:36

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
dt[, list(Num.Elements=length(Elements)), by=c("Start", "End")]

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

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

您可能会注意到这种数据结构很浪费,因为它重复了每个元素的开始和结束。然而,数据表的存储效率非常高-即使您的元素列表确实有数百万长,它也可以很容易地适合并以这种方式进行处理。尝试如下所示的行:

代码语言:javascript
复制
dt = data.table(Start=1:1e6, End=1:1e6, Elements=1:1e6)

来做个演示。这肯定比保持每个元素列表为一个字符串并每次拆分它更快。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15980281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档