Преобразование списка списков в data.frame в R - PullRequest
0 голосов
/ 06 февраля 2019

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

Вот несколько более ранних сообщений:

Как сгладитьсписок списков?

R список списков для data.frame

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

Вот мой пример набора данных:

AA <- list(my.col1 =    1, my.col2 =    4, my.col3 = NULL, my.col4 = NULL)
BB <- list(my.col1 = NULL, my.col2 = NULL, my.col3 = NULL, my.col4 = NULL)
CC <- list(my.col1 =   13, my.col2 =    8, my.col3 =    2, my.col4 =   10)
DD <- list(my.col1 = NULL, my.col2 = NULL, my.col3 =   -5, my.col4 =    7)

my.stuff <- list(AA, BB, CC, DD)
names(my.stuff) <- c("AA", "BB", "CC", "DD")
my.stuff

Вот требуемый data.frame:

desired.object <- read.table(text = '
     my.var   my.col1 my.col2 my.col3 my.col4
        AA       1       4    NULL    NULL
        BB    NULL    NULL    NULL    NULL
        CC      13       8       2      10
        DD    NULL    NULL      -5       7', 
stringsAsFactors = FALSE, header = TRUE, na.strings = "NULL")
desired.object
#  my.var my.col1 my.col2 my.col3 my.col4
#1     AA       1       4      NA      NA
#2     BB      NA      NA      NA      NA
#3     CC      13       8       2      10
#4     DD      NA      NA      -5       7

Я могу получить вывод, который выглядит аналогично, но это совсем не тот формат, который я хочу:

my.stuff2    <- do.call(rbind, my.stuff)
my.stuff2
#    my.col1 my.col2 my.col3 my.col4
# AA 1       4       NULL    NULL   
# BB NULL    NULL    NULL    NULL   
# CC 13      8       2       10     
# DD NULL    NULL    -5      7

Извините, еслиэта проблема уже решена.

Ответы [ 2 ]

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

Как насчет этого?

do <- as.data.frame(do.call(rbind, lapply(my.stuff, as.vector)))
do <- cbind(my.var=rownames(do), do)
do[do == "NULL"] <- NA

Результат

> do
   my.var my.col1 my.col2 my.col3 my.col4
AA     AA       1       4      NA      NA
BB     BB      NA      NA      NA      NA
CC     CC      13       8       2      10
DD     DD      NA      NA      -5       7

Редактировать:

Если нам не нужны списки в качестве объектов столбцов, как разумно предполагает @akrun, мы могли бы сделать это следующим образом:

u <- as.character(unlist(my.stuff, recursive=FALSE))
u[u == "NULL"] <- NA
do <- matrix(as.integer(u), nrow=4, byrow=TRUE, 
             dimnames=list(NULL, names(my.stuff[[1]])))
do <- data.frame(my.var=names(my.stuff), do, stringsAsFactors=FALSE)

Тест:

> all.equal(str(do), str(desired.object))
'data.frame':   4 obs. of  5 variables:
 $ my.var : chr  "AA" "BB" "CC" "DD"
 $ my.col1: int  1 NA 13 NA
 $ my.col2: int  4 NA 8 NA
 $ my.col3: int  NA NA 2 -5
 $ my.col4: int  NA NA 10 7
'data.frame':   4 obs. of  5 variables:
 $ my.var : chr  "AA" "BB" "CC" "DD"
 $ my.col1: int  1 NA 13 NA
 $ my.col2: int  4 NA 8 NA
 $ my.col3: int  NA NA 2 -5
 $ my.col4: int  NA NA 10 7
[1] TRUE
0 голосов
/ 06 февраля 2019

Мы можем использовать рекурсив map

library(tidyverse)
map_df(my.stuff, ~ map_df(.x,  ~ 
                      replace(.x, is.null(.x), NA)), .id = "my.var")  
# A tibble: 4 x 5
#  my.var my.col1 my.col2 my.col3 my.col4
#  <chr>    <dbl>   <dbl>   <dbl>   <dbl>
#1 AA           1       4      NA      NA
#2 BB          NA      NA      NA      NA
#3 CC          13       8       2      10
#4 DD          NA      NA      -5       7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...