2017-02-19 4 views
1

リストのリストがあります。各サブリストは行を表します。私はこれをデータフレームに変換し、すべての列のタイプを保持したいと思います。これは非常に簡単であるように感じますが、私は問題にぶち当たっています。リストのリストをデータフレームに変換します。各リストは行を表し、タイプを保持します。

私の第2の解決策は最良のアプローチですか?

たぶん
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

私たちは、あなたが戻ったばかりの1回の呼び出しで日付を整数に変換することができrbindlist

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