У меня есть список списков, где каждый дополнительный список представляет строку. Я хотел бы преобразовать это в кадр данных, сохраняя типы всех столбцов. Похоже, это должно быть довольно просто, но у меня все время возникают проблемы.Преобразовать список списков в 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)
Вы можете просто конвертировать целые числа обратно даты в одном вызове. Что-то вроде 'res <- do.call (rbind.data.frame, list_of_lists); res $ date <- as.Date (res $ date, origin = "1970-01-01") ' –
Спасибо, хорошая идея. Вы знаете, почему он не сохраняет тип даты в первую очередь? – RobinL
Это задокументировано в разделе '? Rbind.data.frame':« * Любые классы, которые могут иметь исходные данные, будут отброшены ... * «Таким образом, базовый режим хранения класса Date в числовом формате (проверьте' storage.mode (as.Date (Sys.Date()))), поэтому, когда класс разделяется, он становится числом (которое может быть преобразовано обратно к дате, конечно). –