2017-02-19 1 views
1

У меня есть список списков, где каждый дополнительный список представляет строку. Я хотел бы преобразовать это в кадр данных, сохраняя типы всех столбцов. Похоже, это должно быть довольно просто, но у меня все время возникают проблемы.Преобразовать список списков в dataframe, где каждый список представляет строку, сохраняя типы

Является ли мое второе решение лучшим подходом?

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 
Смежные вопросы