2009-10-03 4 views
8

Возьмет следующий код:преобразования матрицы списков регулярной матрицы

foo <- list() 
foo[[1]] <- list(a=1, b=2) 
foo[[2]] <- list(a=11, b=22) 
foo[[3]] <- list(a=111, b=222) 
result <- do.call(rbind, foo) 
result[,'a'] 

В этом случае result[,'a'] показывает список. Есть ли более элегантный способ, так что result является «регулярной» матрицей векторов? Я предполагаю, что есть ручные способы обойти это, но мне было интересно, был ли очевидный шаг, который я отсутствовал.

ответ

9

do.call в списках очень элегантно и быстро. Фактически do.call (rbind, my.list) однажды спас мою задницу, когда мне нужно было объединить огромный список. Это было самым быстрым решением.

Чтобы решить проблему, возможно, что-то вроде:

do.call(rbind, lapply(foo, unlist)) 


> result.2 <- do.call(rbind, lapply(foo, unlist)) 
> result.2 
     a b 
[1,] 1 2 
[2,] 11 22 
[3,] 111 222 
> result.2[, 'a'] 
[1] 1 11 111 
> 
+1

Я желаю 'do.call' +' rbind' было быстро. Вы когда-нибудь пробовали использовать его с 10 000 кадров данных в списке ?! – hadley

+0

@hadley: Кажется, я помню, как учился в классе статистики вычислений, что это был самый быстрый способ (после многих других неудачных попыток) связать списки. Возможно, я помню не то. Что быстрее? – Vince

+2

Вы можете управлять примерно в 4 раза быстрее, если вы тщательно напишете его самостоятельно. 'rbind.fill' в следующем выпуске plyr будет включать мои последние лучшие усилия. – hadley

1

Одно из возможных решений заключается в следующем (но я заинтересован в альтернативах):

new.result <- matrix(unlist(result), ncol=ncol(result), 
       dimnames=list(NULL, colnames(result))) 
Смежные вопросы