Преобразование списка в фрейм данных - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть ряд сложных списков, которые я пытаюсь преобразовать в формат фрейма данных в R. Каждый список будет конвертирован в фрейм данных индивидуально.Некоторые из списков имеют пустые значения, что затрудняет преобразование списка во фрейм данных.

Я попытался lapply / sapply найти максимальную длину списка, но ни одна из них не работает.Кроме того, использование do.call и unlist не дает мне данных в нужном мне формате (оно теряет заголовки столбцов и форматирует таблицу в три столбца, а не во многие столбцы).Я обнаружил, что следующий код работает с первыми 5 списками:

max_list<-max(rapply(List, length))
df<-as.data.frame(rapply(List, function(x) 'length<-'(x, max_list), how="list"))

Однако, когда я пытаюсь применить это в цикле для всех списков, я получаю следующую ошибку.

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : arguments imply differing number of rows: 3, 0

Моя конечная цель состоит в том, чтобы части списка, в которых отсутствуют значения, были преобразованы в "NA".

Могу ли я что-нибудь добавить в этот код, чтобы избежать ошибки?Или есть что-то еще, что я могу сделать, чтобы преобразовать те списки, которые имеют различное количество строк?

РЕДАКТИРОВАТЬ:

Я не могу опубликовать свой точный код длявводится в оперативном режиме, но список является вложенным и очень сложным.

Пример ввода:

iter1 <- list(item1 = 1, item2 = "a",item3="b")
iter2 <- list(item1 = 2, item2 = "c")
List <- list(iter1 = iter1, iter2 = iter2)

В идеале, я хотел бы для этого вывода в качестве фрейма данных:

V1     V2     V3     V4     V5
1      a      b      2      c

Как уже упоминалось, я смог получить этот результат с кодом выше.Но я не уверен, почему код не работает при применении к более сложным спискам.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете использовать unlist и аргумент recursive = T.

df <- data.frame(as.list(unlist(x = List, recursive = T, use.names = F)))
names(df) <- paste0("V", 1:ncol(df))
df

  V1 V2 V3 V4 V5
1  1  a  b  2  c

Чтобы было легче читать:

library(dplyr)

unlist(x = List, recursive = T, use.names = F) %>%
  as.list() %>%
  data.frame() %>%
  setNames(nm = paste0("V", 1:ncol(.)))

  V1 V2 V3 V4 V5
1  1  a  b  2  c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...