我想以
的形式创建数据结构Start, End, Elements
3 , 6 , {4,5}
4 , 10 , {7,8,9}
....
总之,我正在沿着一条线移动一个球。 “开始”代表球的最左侧位置,“结束”代表最右侧。 “元素”意味着我以某种方式找到那些特殊的位置。当元素数量增长非常大时,使用哪种最佳数据结构?我唯一能想到的是一个数据框,其中第3列是一个适当格式化的字符串。如果我想查看集合中的每个数字,我将不得不解析字符串。 R有没有更好的数据格式或者是关于它的数据格式?
谢谢!
答案 0 :(得分: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
你当然也可以完全抛弃数据框,简单地使用一个普通的旧列表(无论如何,在很多情况下这可能更有意义):
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
答案 1 :(得分: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
这可以让您轻松地对数据进行多种处理,例如确定每个范围内的元素数量:
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)
进行演示。除了将每个元素列表保持为字符串并且每次都将其拆分之外,当然处理速度更快。