Создание индексированного многомерного массива в [R] из кадра данных 2x2 - PullRequest
1 голос
/ 13 апреля 2011

У меня есть двумерный 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' накладывать друг на друга куски неравного размера?Или есть более эффективный способ создания нужного массива?

1 Ответ

1 голос
/ 13 апреля 2011

полностью переписан (спасибо за пример). Я переписал ваш пример данных, чтобы он был немного более компактным.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...