2017-03-13 120 views
0

我有類似於下面的SampleData的數據,它具有不同長度的列表,我想將它們合併到下面的Desired Result之類的數據框中。我已經嘗試使用下面的例子中的qpcR包中的lapply和cbind.na,但由於某種原因,它不會讓我將結果轉換爲數據框。如果我只使用了兩個列表和cbind.na,它會將它們結合起來並像我想要的那樣將NA添加到最後,但是當我嘗試在lapply中使用它時,它將它們作爲不同長度列表的列表。任何提示,非常感謝。將不同長度的列表合併到數據幀中

SampleData<-list(list(1,2,3),list(1,2),list(3,4,6,7)) 

Desired Result: 
structure(list(V1 = c(1, 2, 3, NA), V2 = c(1, 2, NA, NA), V3 = c(3, 
4, 6, 7)), .Names = c("V1", "V2", "V3"), row.names = c(NA, -4L 
), class = "data.frame") 


Example Code: 

lapply(SampleData,qpcR:::cbind.na) 
+2

也許你想'Reduce'而不是'lapply'。我沒有安裝'qpcR',所以我無法檢查... – Gregor

回答

1

我的第一直覺看你的數據是,通過使用data.frame,你是含蓄指出跨行項目配對。也就是說,在您的示例中,$V1的「3」和$V3的「6」意味着相互關聯。 (如果你看看mtcars,第一行的每一列直接與關聯單獨與「馬自達RX4」)。如果不是這樣,那麼將它們翹曲成data.frame這樣就是錯誤地表示您的數據並且喜歡鼓勵錯誤的分析/假設。

假設它們實際上是「配對」的,我的下一個直覺就是嘗試類似do.call(cbind, SampleData)之類的東西,但是這樣做可以回收再利用的數據,而不是你想要的。所以,阻止再循環的訣竅就是強制它們的長度相同。由於數據出現同質(應該是,如果你打算把每個元素作爲一個data.frame的列)

names(SampleData2) <- paste("V", seq_along(SampleData2), sep = "") 

,它是這不同於有用:

maxlen <- max(lengths(SampleData)) 
SampleData2 <- lapply(SampleData, function(lst) c(lst, rep(NA, maxlen - length(lst)))) 

我們可以先重命名列出來:

SampleData3 <- lapply(SampleData2, unlist) 

然後,它的那樣直接爲:

as.data.frame(SampleData3) 
# V1 V2 V3 
# 1 1 1 3 
# 2 2 2 4 
# 3 3 NA 6 
# 4 NA NA 7 
+0

謝謝你回覆我。 do.call(qpcR :::cbind.na,SampleData)完成了這個訣竅。 – user3476463

0

下面是修改後的版本與length<-分配

setNames(do.call(cbind.data.frame, lapply(lapply(SampleData, unlist), 
     `length<-`, max(lengths(SampleData)))), paste0("V", 1:3)) 
# V1 V2 V3 
#1 1 1 3 
#2 2 2 4 
#3 3 NA 6 
#4 NA NA 7 
相關問題