2013-07-14 36 views
1

我有長度30000的列表,並且每個列表元素包含長度爲6提取元件

實施例中的一個矢量(具有的長度僅有2):

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

我想要將這些列表「拼合」成一個數據框並創建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。另一個選項就像** plyr **包中的colwise(as.factor)(yourData)'。 – 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