一种不同的策略是创建一个向量和一个分区,例如,表示
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
处理这些数据的一个习惯用法是 to unlist
, transform, then relist
; 两者都很便宜unlist
,relist
所以上面的长手版本是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 类是合适的。