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

|| 我有一个带有面板数据的二维data.frame(一段时间内的个人观察)。我相信如果我创建了一个3维数组,其中包含具有以下维度的相同数据:日期,个人,值,这将更加有用。 因此,我的方法是隔离现有2x2数据框中的特定日期,然后将这些切片彼此堆叠以获取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”功能将大小不等的切片堆叠在一起?或者,是否有更有效的方法来创建所需的数组?     
已邀请:
完全重写(感谢示例)。 我重写了您的示例数据,使其更加紧凑。
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)
或者,如果您不想用NA填充空格,但想拥有一个“破烂的”列表,则可以执行以下操作:
lapply(split(df1,df1$date),function(x) subset(x,select=-date))
    

要回复问题请先登录注册