在R中存储和处理面板数据的有效方法

时间:2017-03-09 11:37:34

标签: r multidimensional-array parallel-processing

假设有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集群?

任何帮助将不胜感激。

2 个答案:

答案 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列的列表,您可以将更多参数传递给第二部分以仅提取所需的日期值。