Data binding 从2x2数据帧在[R]中创建索引多维数组

Data binding 从2x2数据帧在[R]中创建索引多维数组,data-binding,r,multidimensional-array,Data Binding,R,Multidimensional Array,我有一个带有面板数据的二维data.frame(一段时间内的个人观察)。我相信,如果我创建了一个包含相同维度数据的三维数组,它会更有用:日期、个人、值 因此,我的方法是在现有的2x2数据帧中隔离特定的日期,然后将这些片段堆叠在彼此的顶部,以获得三维数组。但是,每个切片都有不同数量的行,因此“abind”函数不允许我对它们进行堆栈 # create example data frame df1 = cbind(rep(8,12),c(rep(4,4),rep(3,4),2,2,1,1), rep(

我有一个带有面板数据的二维data.frame(一段时间内的个人观察)。我相信,如果我创建了一个包含相同维度数据的三维数组,它会更有用:日期、个人、值

因此,我的方法是在现有的2x2数据帧中隔离特定的日期,然后将这些片段堆叠在彼此的顶部,以获得三维数组。但是,每个切片都有不同数量的行,因此“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'函数将大小不等的切片堆叠在另一个切片上?或者,有没有更有效的方法来创建所需的数组?

完全重写(感谢示例)。 我重写了您的示例数据,使其更加紧凑

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)
完全重写(感谢示例)。 我重写了您的示例数据,使其更加紧凑

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)

我不是100%确定你所说的“2x2数据帧”是什么意思。天真地阅读这听起来像是两行两列(我不认为这不是你的意思)。如果你能提供一个小的可复制的例子,那将非常有帮助;代码现在包含一个可复制的示例。新答案是否符合您的要求?是;是的,谢谢。然而,当我将它用于我的真实数据集(不是可复制的示例)时,我得到了一个我正试图找出的错误。当我“融化”数据时,它会说:“聚合需要乐趣。聚合:长度用作默认值”,结果是一个包含一组0、1和2的数组。当我弄明白后,我会重新发布。再次感谢!我不是100%确定你所说的“2x2数据帧”是什么意思。天真地阅读这听起来像是两行两列(我不认为这不是你的意思)。如果你能提供一个小的可复制的例子,那将非常有帮助;代码现在包含一个可复制的示例。新答案是否符合您的要求?是;是的,谢谢。然而,当我将它用于我的真实数据集(不是可复制的示例)时,我得到了一个我正试图找出的错误。当我“融化”数据时,它会说:“聚合需要乐趣。聚合:长度用作默认值”,结果是一个包含一组0、1和2的数组。当我弄明白后,我会重新发布。再次感谢!谢谢-这是有帮助的,但不完全是我要找的。我在我的答案中添加了可复制的代码(如上)。我认为当每次观察只有一个“值”(日期、主题)时,您的方法是有效的。但我希望通过一个三维数组,我可以处理每个观测值的多个值。我的数据使用它的原因是替换了您的最后一行代码,使之在cast函数中具有sum:
cast(m,Individual~…~date,sum)
谢谢-这很有帮助,但并不完全是我想要的。我在我的答案中添加了可复制的代码(如上)。我认为当每次观察只有一个“值”(日期、主题)时,您的方法是有效的。但我希望通过一个三维数组,我可以处理每个观测值的多个值。它对我的数据起作用的原因是替换了最后一行代码,使之在cast函数中具有sum:
cast(m,Individual~…~date,sum)
谢谢-