2013-07-14 2 views
1

У меня есть список длины 30000 и каждый элемент списка содержит один вектор длины 6.Извлечение элементов из вектора в списках

примера (с длиной всего 2):

trainLists <- list(c(1,2,3,4,5,6),c(7,8,9,10,11,12)) 

I хотите «сгладить» эти списки в фреймворк данных и создать 6 факторов (один соответствует каждому из элементов в векторах в списке).

Таким образом, результат будет:

enter image description here

можно выполнить это с помощью цикла, такие как

for (i in 1:length(trainLists){ 
    factor1 [i] <- trainLists[[i]][1] 
    factor2 [i] <- trainLists[[i]][2] 
    factor3 [i] <- trainLists[[i]][3] 
    factor4 [i] <- trainLists[[i]][4] 
    factor5 [i] <- trainLists[[i]][5] 
    factor6 [i] <- trainLists[[i]][6] 
} 

но это ужасно медленно. Как лучше всего это сделать?

+5

См. '? Rbind' и'? Cbind'. Подсказка: начните с тестирования 'do.call (rbind, trainLists)' на ваших небольших данных, чтобы посмотреть, что он делает. – Arun

+0

О, это круто! Благодаря! –

+0

Чтобы принудить к факторам, вы можете использовать 'sapply/lapply', но для этого, скорее всего, потребуется другой вызов' as.data.frame'. Другим вариантом будет нечто вроде 'colwise (as.factor) (yourData)' из пакета ** plyr **. – joran

ответ

0

Как было отмечено в комментариях, большинство того, что вы хотите сделать, это достигается с помощью простого do.call(rbind, ...), как это:

> trainLists <- list(c(1,2,3,4,5,6),c(7,8,9,10,11,12)) 
> trainLists 
[[1]] 
[1] 1 2 3 4 5 6 

[[2]] 
[1] 7 8 9 10 11 12 

> do.call(rbind, trainLists) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 2 3 4 5 6 
[2,] 7 8 9 10 11 12 

Принимая вещи на несколько шагов вперед, вы можете сделать что-то подобное :

cbind(example = seq_along(trainLists), 
     setNames(data.frame(do.call(rbind, trainLists)), 
       paste0("Factor_", sequence(
       max(sapply(trainLists, length)))))) 
# example Factor_1 Factor_2 Factor_3 Factor_4 Factor_5 Factor_6 
# 1  1  1  2  3  4  5  6 
# 2  2  7  8  9  10  11  12 
Смежные вопросы