2016-04-22 2 views
0

Я нашел, чтобы сделать это, используя reshape2, но он довольно медленный и не совсем дает мне именно то, что я хочу. У меня есть data.frame, который выглядит следующим образом:конвертировать X-Y data.frame в матрицу для каждого столбца в R эффективно

df<-data.frame(expand.grid(1:10,1:10)) 
colnames(df) <- c("x","y") 

for(i in 3:10){ 
df[i] <- runif(100,10,100) 
} 

Я бегу:

require(reshape2) 

matrices<-lapply(colnames(df)[-c(1:2)],function(x){ 
    mat<-acast(df, y~x, value.var=x, fill= 0,fun.aggregate = mean) 
    return(mat) 
}) 

там у меня есть список матриц для каждого вектора значения в моих данных, я могу превратить это в массив от 1: 10,1: 10,1: 10, но я смотрю, есть ли более быстрый способ сделать это, поскольку мои наборы данных могут содержать много столбцов значений, и этот процесс может занять много времени, и я не могу как представляется, найти более эффективный способ сделать это.

Спасибо за любую помощь.

+0

Взгляните на 'dcast' в' данных .table' упаковка. Он обычно намного эффективнее, чем 'reshape2'. –

+0

Опишите, что вы хотите сделать, вместо того, чтобы просто ссылаться на «это», как если бы ваш заголовок сам объяснял – Frank

+0

Я считаю, что мой ответ - один из наиболее эффективных методов решения проблемы, насколько я понимаю. – lmo

ответ

0

Если data.frame регулярно хранится, как вы говорите, вы могли бы сделать это в for петлю, которая на самом деле может быть быстрее, чем литье:

# preallocate array 
myArray <- array(0, dim=c(10,10,10)) 

# loop through: 
for(i in 1:10) { 
    myArray[,,i] <- as.matrix(df[df$y==i,]) 
} 
Смежные вопросы