假设有1024个人的时间序列数据存储在单独的csv文件中。我fread
将它们记入内存,获取1024 data.frames
,格式如下
表$ Individual1
SampleDate,var1,var2,var3,...
2001-01-01,1001,2001,3001,...
2001-01-02,1002,2002,3002,...
2001-01-03,1004,2004,3004,...
...
2017-01-01,9999,9999,9999,...
表$ Individual2
SampleDate,var1,var2,var3,...
1992-03-01,1101,2101,3101,...
1992-03-02,1102,2102,3102,...
1992-03-03,1104,2104,3104,...
...
2017-01-01,8888,8888,8888,...
...
这些表具有不同的初始观察日期,因为个体具有不同的出生日期,但是每个后续日期按顺序对应于一行。如果我使用数组来存储组合数据,那么许多元素(出生前几天)将为空。在内存中组织它们以便快速访问横截面数据的最佳方法是什么?例如,我想在2010-04-01获取当天存在的所有个人的var1,var3
。目前我必须sapply
一个提取每个表的一部分的函数,这非常慢。
另一件事。假设我需要在8个不同的日期通过函数f(var1,var2,var3,...)
对这些个体进行排序。现在这是一个令人尴尬的并行任务,所以我很乐意抓住并行包,但却发现clusterExport需要永远这些表。是否有任何使用共享内存的clusterExport变体,或者我应该切换到linux来制作fork集群?
任何帮助将不胜感激。
答案 0 :(得分:1)
为什么不添加带有个人ID的字段并将所有数据放入一个数据帧中。
将df1作为sample1,将df2作为sample2,然后
df1$IndID <- "01"
将个人ID添加到数据框,这将导致
> df1
SampleDate var1 var2 var3 IndID
1 2001-01-01 1001 2001 3001 01
2 2001-01-02 1002 2002 3002 01
3 2001-01-03 1004 2004 3004 01
4 2017-01-01 9999 9999 9999 01
与df2相同
df2$IndID <- "02"
将它们组合到一个数据帧
df <- rbind(df1,df2)
导致
> df
SampleDate var1 var2 var3 IndID
1 2001-01-01 1001 2001 3001 01
2 2001-01-02 1002 2002 3002 01
3 2001-01-03 1004 2004 3004 01
4 2017-01-01 9999 9999 9999 01
5 1992-03-01 1101 2101 3101 02
6 1992-03-02 1102 2102 3102 02
7 1992-03-03 1104 2104 3104 02
8 2017-01-01 8888 8888 8888 02
然后处理数据很容易且省时 - 例如。你的问题 - 获取var1和var3
> df[df$SampleDate=="2017-01-01", c("var1","var3")]
var1 var3
4 9999 9999
8 8888 8888
对数据进行排序......
> library(dplyr)
> arrange(df, IndID, var1, var2, var3)
答案 1 :(得分:1)
部分答案:
lapply(Tables, '[[', 'var1')
如果为每个indvidual返回一个包含var1列的列表,您可以将更多参数传递给第二部分以仅提取所需的日期值。