Список во фрейм данных с map_df сдвигает строки

Мои выходные данные представляют собой список с вложенными списками данных участников.

  • So one list will have Participant 1 through 5, for example
    • Within that list, Participant 1 will have 2 days of data and participant 2 may have 5 days of data (nested lists), etc.
DF = list(list(list(0.601705399641698)), list(list(1.0967226417789), 
                                         list(1.18794820947846), list(3.98557480186904)), list(list(
                                           0.995996328131446), list(0.564513260465204), list(1.31356753668681), 
                                           list(0.891872221784271)), list(list(0.649008813684839), list(
                                             1.0036615512612), list(NA_real_)), list(list(0.828273303379322)))

Когда я использую map_df для объединения этих списков, он сдвигает строки следующим образом:

xtest = map_df(DF, ~as.data.frame(.x), .null = NA)

# which comes out like this
structure(list(X0.601705399641698 = c(0.601705399641698, NA, 
                                      NA, NA, NA), X1.0967226417789 = c(NA, 1.0967226417789, NA, NA, 
                                                                        NA), X1.18794820947846 = c(NA, 1.18794820947846, NA, NA, NA), 
               X3.98557480186904 = c(NA, 3.98557480186904, NA, NA, NA), 
               X0.995996328131446 = c(NA, NA, 0.995996328131446, NA, NA), 
               X0.564513260465204 = c(NA, NA, 0.564513260465204, NA, NA), 
               X1.31356753668681 = c(NA, NA, 1.31356753668681, NA, NA), 
               X0.891872221784271 = c(NA, NA, 0.891872221784271, NA, NA), 
               X0.649008813684839 = c(NA, NA, NA, 0.649008813684839, NA), 
               X1.0036615512612 = c(NA, NA, NA, 1.0036615512612, NA), NA_real_. = c(NA_real_, 
                                                                                    NA_real_, NA_real_, NA_real_, NA_real_), X0.828273303379322 = c(NA, 
                                                                                                                                                    NA, NA, NA, 0.828273303379322)), row.names = c(NA, -5L), class = "data.frame")

  X0.601705399641698 X1.0967226417789 X1.18794820947846 X3.98557480186904 X0.995996328131446 X0.564513260465204 X1.31356753668681 X0.891872221784271
1          0.6017054               NA                NA                NA                 NA                 NA                NA                 NA
2                 NA         1.096723          1.187948          3.985575                 NA                 NA                NA                 NA
3                 NA               NA                NA                NA          0.9959963          0.5645133          1.313568          0.8918722
4                 NA               NA                NA                NA                 NA                 NA                NA                 NA
5                 NA               NA                NA                NA                 NA                 NA                NA                 NA
  X0.649008813684839 X1.0036615512612 NA_real_. X0.828273303379322
1                 NA               NA        NA                 NA
2                 NA               NA        NA                 NA
3                 NA               NA        NA                 NA
4          0.6490088         1.003662        NA                 NA
5                 NA               NA        NA          0.8282733

Кажется, что данные добавляются по столбцам и сдвигаются новые значения вместо того, чтобы начинать с столбца 1, строки 2 для участника 2 и так далее.

Есть ли способ изменить вывод фрейма данных map_df, чтобы он начинался со столбца 1, но сохранял строку, соответствующую каждому участнику?

Ожидаемый результат:

                 1              2                 3                  4
1          0.6017054         NA              NA                NA # participant 1
2          1.096723          1.187948        3.985575          NA # participant 2
3          0.9959963         0.5645133       1.313568          0.8918722 # participant 3
4          0.6490088         1.003662        NA                NA # Participant 4
5          0.8282733         NA              NA                NA # Participant 5


person Shai    schedule 16.10.2019    source источник
comment
Пожалуйста, включите ваш ожидаемый вывод, т. е. результат, который вы хотите, а не только результат, который вам не нужен.   -  person Maurits Evers    schedule 16.10.2019
comment
Извините, обновил.   -  person Shai    schedule 16.10.2019
comment
Данные вашего образца list не содержат имен. Откуда берутся окончательные имена столбцов "Clm1", "Clm2", "Clm3", "Clm4"? В tidyverse изменение формы записей из безымянного list обычно приводит к некоторым предупреждениям/ошибкам. Имеют ли элементы ваших фактических данных list имена?   -  person Maurits Evers    schedule 16.10.2019
comment
Исходный вывод списка называется [[1]] и так далее для каждого списка/вложенного списка. Функция map_df, кажется, просто называет столбец значением в этом списке. Имена последних столбцов Clm1 и т. Д. В данный момент не имеют значения, это я просто пытался уточнить. Они могут быть 1,2,3,4 по умолчанию или без имен для столбца, и я могу переименовать их позже.   -  person Shai    schedule 16.10.2019
comment
[[1]] и так далее говорит вам, что элементы безымянны.   -  person Maurits Evers    schedule 16.10.2019
comment
Я должен сказать, что изо всех сил пытаюсь понять ваш ожидаемый результат. Например, что случилось с элементами 1-3 из DF? Я не вижу их нигде в ожидаемом выводе. И наоборот, первые три строки не имеют совпадающих записей в DF. Единственные записи, которые кажутся совпадающими, это элементы 4-5 из DF.   -  person Maurits Evers    schedule 16.10.2019
comment
Я соответственно обновил ожидаемый результат DF   -  person Shai    schedule 16.10.2019


Ответы (1)


tidyverse подход

library(tidyverse)
map_dfr(DF, ~unlist(.x) %>% t() %>% as.data.frame())
#         V1        V2       V3        V4
#1 0.6017054        NA       NA        NA
#2 1.0967226 1.1879482 3.985575        NA
#3 0.9959963 0.5645133 1.313568 0.8918722
#4 0.6490088 1.0036616       NA        NA
#5 0.8282733        NA       NA        NA

Или то же самое с использованием data.table

library(data.table)
rbindlist(lapply(DF, function(x) data.table(t(unlist(x)))), fill = TRUE)
#          V1        V2       V3        V4
#1: 0.6017054        NA       NA        NA
#2: 1.0967226 1.1879482 3.985575        NA
#3: 0.9959963 0.5645133 1.313568 0.8918722
#4: 0.6490088 1.0036616       NA        NA
#5: 0.8282733        NA       NA        NA
person Maurits Evers    schedule 16.10.2019
comment
Это работает для моего подмножества данных, которые я опубликовал из 5 участников; однако, когда я пытаюсь применить любой из этих методов к 100 спискам участников, я получаю сообщение об ошибке: Ошибка в t.default(unlist(x)) : аргумент не является матрицей. Обновление: я нашел значение NULL там, где должен быть список, исправив его, установив для него значение 0. - person Shai; 16.10.2019