2011-04-13 97 views
1

一个索引多维数组我有面板数据的2维data.frame(在一段时间个别观测)。我相信如果我创建了一个三维数组,其中包含具有相同维度的数据:日期,个人,值,那么这会更有用。创建在[R]从2×2数据帧

因此,我的方法是将隔离现有的2×2数据帧中的特定日期,然后堆叠在彼此的顶部上这些切片以获得3维阵列。但是,每个切片都有不同的行数,所以'abind'函数不允许我堆叠它们。

# create example data frame 
df1 = cbind(rep(8,12),c(rep(4,4),rep(3,4),2,2,1,1), 
rep(2010,12),c("John","Frank","Bill","Anne","John", 
"Frank","Bill","Anne","John","Frank","John","Frank"), 
1:12,90:79,41:52) 

df1 = data.frame(df1) 
names(df1) = c("MM","DD","YR","Individual","Value1","Value2","Value3") 

# the 'cube' function isolates a specific MM/DD/YR 'slice' 
# Later I will attempt to stack the slices to get a 3-d array. 
cube = function(MM,DD,YR) { 
df2 = df1[df1$MM == MM & df1$DD == DD & df1$YR == YR,] 
df2 
} 

# specify some parameter values 
m = 8 
d = c(1:4) 
y = 2010 

# apply 'cube' function to all date combinations specified 
# by parameters m, d, y 

out = apply(expand.grid(m,d,y),1, 
function(x,y,z) cube(x[1],x[2],x[3])) 

out = array(out) 
k = dim(expand.grid(m,d,y)) 
z = data.frame(out[1]) 

require(abind) 

# specify function that will transform 2-d data.frame into 3-d array. 
for (i in 2:k[1]){ 
p = data.frame(out[i]) 
z = abind(z,p,along = 3) 
} 

错误消息当我运行的循环是我得到:

Error in abind(z, p, along = 3) : 
    arg 'X2' has dims=4, 7, 1; but need dims=2, 7, X 

我使用的CRAN包 'abind'。

问:有没有办法让“abind”功能堆叠在彼此顶部不等的大小片?或者,有没有更有效的方法来创建所需的数组?

+1

我不是100%确定是什么你的意思是“2x2 data.frame”。天真地阅读这听起来像2行和2列(这不可能是你的意思,我不认为)。如果您可以提供一个可重复使用的小例子,这将非常有帮助。 – 2011-04-13 19:03:32

+0

好的;代码现在包含一个可重现的例子。 – 2011-04-13 23:16:54

+0

新的答案是否可以做你想要的? – 2011-04-14 18:26:43

回答

1

完全重写(对于例如由于)。 我重写了您的示例数据,使其稍微更紧凑。

df1 <- data.frame(MM=rep(8,12),DD=c(rep(4,4),rep(3,4),2,2,1,1), 
        YR=rep(2010,12), 
        Individual=c("John","Frank","Bill","Anne","John", 
        "Frank","Bill","Anne","John","Frank","John","Frank"), 
        Value1=1:12,Value2=90:79,Value3=41:52) 
## create composite date variable 
df1 <- transform(df1,date=as.Date(paste(YR,MM,DD,sep="/"))) 
## drop date components 
df1 <- subset(df1,select=-c(MM,DD,YR)) 
library(reshape) 
m <- melt(df1,id.var=c("Individual","date")) 
cast(m,Individual~...~date) 

另外,如果你不想填空格与来港,但希望有一个“破烂”列表中,你可以这样做:

lapply(split(df1,df1$date),function(x) subset(x,select=-date)) 
+0

谢谢 - 这是有用的,但不是我正在寻找。我在上面添加了可重复的代码。我认为你的方法在每个观察值只有一个“值”(日期,子项)时有效。但我希望对于一个三维数组,我可以处理每个观察值的多个值。 – 2011-04-13 20:32:16

+0

什么让它为我的数据工作取代你的最后一行代码,以在演员函数中有和:'cast(m,Individual〜...〜date,sum)'Thank you- – 2011-05-13 22:55:35