用于在R中创建BIG数据的数据结构

时间:2013-06-18 12:34:27

标签: r data-structures bigdata

我在R中编写基因水平分析脚本,我将不得不处理大量数据。

我最初的想法是创建一个超级列表结构,列表中的一组列表。基本上结构是

#12.8 mins
list[[1:8]][[1:1000]][[1:6]][[1:1000]] 

这是巨大的,仅需要超过12分钟来设置数据结构。对这个过程进行流式处理,我可以在设置1:8列表的一个值时将其降低到大约1.6分钟,所以基本上......

#1.6 mins
list[[1:1]][[1:1000]][[1:6]][[1:1000]] 

通常情况下,我会根据需要随时创建结构,然而,我正在分配1:1000的步骤,这意味着,我不知道他们将返回哪个顺序。< / p>

是否还有其他用于处理此级别数据创建的包? 我可以在我的方法中使用更高效的数据结构吗?

如果这看起来完全是错误的方法,我很抱歉,但这是我第一次处理R中的大数据。

2 个答案:

答案 0 :(得分:3)

请注意,列表是向量,与任何其他向量一样,它们可以具有dim属性。

l <- vector("list", 8 * 1000 * 6 * 1000)
dim(l) <- c(8, 1000, 6, 1000)

这实际上是即时的。您可以使用[[访问单个元素,例如l[[1, 2, 3, 4]]

答案 1 :(得分:2)

另一种策略是创建向量和分区,例如,表示

list(1:4, 5:7)

作为

l = list(data=1:7, partition=c(4, 7))

然后可以进行矢量化计算,例如,

logl = list(data=log(l$data), partition = l$partition)

和其他聪明的事情。这避免了创建复杂的列表和暗示的迭代。这种方法在Bioconductor IRanges*List类中形式化。

> library(IRanges)
> l <- NumericList(1:4, 5:7)
> l
NumericList of length 2
[[1]] 1 2 3 4
[[2]] 5 6 7
> log(l)
NumericList of length 2
[[1]] 0 0.693147180559945 1.09861228866811 1.38629436111989
[[2]] 1.6094379124341 1.79175946922805 1.94591014905531

使用此数据的一个习惯用法是unlist,转换,然后是relist; unlistrelist都很便宜,所以上面的长版本是relist(log(unlist(l)), l)

根据您的数据结构,DataFrame类可能是合适的,例如,以下内容可以像data.frame(子集等)一样进行操作,但包含* List元素。

> DataFrame(Sample=c("A", "B"), VariableA=l, LogA=log(l))
DataFrame with 2 rows and 3 columns
       Sample     VariableA                                              LogA
  <character> <NumericList>                                     <NumericList>
1           A     1,2,3,...          0,0.693147180559945,1.09861228866811,...
2           B         5,6,7 1.6094379124341,1.79175946922805,1.94591014905531

对于染色体上基因(或其他特征)坐标至关重要的基因组数据,GenomicRanges包和GRanges / GRangesList类是合适的。