2012-10-13 65 views
4

我已經閱讀了很多關於將列表列表轉換爲df的答案。但是,我已經注意到它們都具有相同的列表長度(在主要列表中)。我有不同的情況:不同長度的數據列表列表R

h1 <- list(USA = c(10,13,17,11), RUSSIA = NULL, BRAZIL = NULL, 
    CHINA = c(11,11,10,8,12), TAIWAN = c(12,9,9,11,9,12,14), CHILE = NULL) 

我想上面的列表h1轉換爲data.frame。我的預期輸出應該是一個data.frame,它有兩列 - country_name,list。事情是這樣的:

country_name, list 
USA [10, 13, 17, 11] 
RUSSIA NULL 
BRAZIL NULL 
CHINA [11, 11, 10, 8, 12] 
TAIWAN [12, 9, 9, 11, 9, 12, 14] 
CHILE NULL 

我做的follwing,但是,沒有工作:

do.call(rbind, h1) 

它試圖保持列編號相同的所有行。我不要那個。我想看看如何使用ldply來處理這種情況。任何建議表示讚賞。

回答

2

這裏有一種方法:

R> as.data.frame(as.matrix(h1)) 
          V1 
USA    10, 13, 17, 11 
RUSSIA     NULL 
BRAZIL     NULL 
CHINA  11, 11, 10, 8, 12 
TAIWAN 12, 9, 9, 11, 9, 12, 14 
CHILE      NULL 

R> as.data.frame(as.matrix(h1))['TAIWAN', ] 
$TAIWAN 
[1] 12 9 9 11 9 12 14 
+0

我想這在技術上只有1列,但你可以添加一個「國家」列與rownames如果你想。 – GSee

3

您可以將列表轉換爲一個矩陣,矩陣的每個元素都將是一個列表。

d1 <- data.frame(country_name=names(h1), list=matrix(h1)) 

這就是說,我建議不要這樣做,因爲它不適合R範式。大多數R函數假定矩陣包含一種原子類型的元素。

+0

我同意Joshua,通常你想利用R數據結構來更簡單/更快的分析。另一種做法是將這些數據轉換爲數據框,其中一列是值,另一列是國名(與列表中的值重複多少次)。你可以使用'plyr :: ldply(h1,cbind)'來實現。 – emre

相關問題