2017-02-19 45 views
1

我有一個列表列表,其中每個子列表代表一行。我想將其轉換爲數據框,保留所有列的類型。這感覺應該是相當直接的,但我一直在遇到問題。將列表轉換爲數據框,其中每個列表代表一行,保留類型

我的第二個解決方案是最好的方法嗎?

l1 <- list(id="a", date=as.Date("2017-01-01"), value=10) 
l2 <- list(id="b", date=as.Date("2017-01-02"), value=12) 
list_of_lists <- list(l1,l2) 

# Does not work - dates are converted to integers 
do.call(rbind.data.frame, list_of_lists) 

# Does work, but have to explicitly pass stringsAsFactors, 
# and seems inefficient 
list_of_dfs <- lapply(list_of_lists, data.frame, stringsAsFactors=FALSE) 
do.call(rbind, list_of_dfs) 
+0

你可以只轉換整數回日期在一個呼叫。像'res < - do.call(rbind.data.frame,list_of_lists); res $ date < - as.Date(res $ date,origin =「1970-01-01」)' –

+0

謝謝 - 好主意。你知道爲什麼它不保存日期類型嗎? – RobinL

+1

它在'?rbind.data.frame'下有記錄:「*輸入可能有的任何類都被丟棄...... *」因此Date類的數據類型的底層存儲模式(檢出'storage.mode(as.Date (Sys.Date()))'),所以當類被剝離時,它成爲一個數字(可以轉換回當然的日期)。 –

回答

2

或許真的整潔,

library(dplyr) 
bind_rows(list_of_lists) 
# A tibble: 2 × 3 
#  id  date  value 
# <chr>  <date> <dbl> 
#1  a 2017-01-01 10 
#2  b 2017-01-02 12 
3

我們可以使用rbindlist

library(data.table) 
rbindlist(list_of_lists) 
# id  date value 
#1: a 2017-01-01 10 
#2: b 2017-01-02 12 
相關問題