R rbind: объединить каждый элемент вложенного списка - PullRequest
0 голосов
/ 01 марта 2019

У меня трудные времена, пытаясь объединить data.frames, которые являются элементами списка списков в R. Я внедрил первое необработанное решение с циклом for, но (конечно) оно становится очень медленным, так какдлина списка увеличивается.

(ОБНОВЛЕНИЕ: я добавил элемент "message" в каждый вложенный список)

Вот пример кода:

list1 = list()
list1[[1]] = list(df = data.frame(A = 1 : 10, B = 30 : 21), 
                  message = "first list")
list1[[2]] = list(df = data.frame(A = 11 : 20, B = 20 : 11), 
                  message = "second list")
list1[[3]] = list(df = data.frame(A = 21 : 30, B = 30 : 21), 
                  message = "third list")

dfFinal = data.frame()
for(nIndexList in 1 : length(list1)) {
  dfFinal = rbind(dfFinal, list1[[nIndexList]]$df)
}

Есть либолее быстрый способ сделать это (например, векторизация)?

1 Ответ

0 голосов
/ 01 марта 2019

обновление

В соответствии с новым требованием - каждый подсписок теперь содержит вектор данных и вектор - мы должны фильтровать по data.frame s

do.call(rbind, c(Filter(is.data.frame, unlist(list1, recursive = FALSE)),
                 make.row.names = FALSE))

первоначальный ответ (в каждом подсписке содержался только кадр данных sinlge)

Вы можете использовать unlist с аргументом recursive = FALSE, а затем do.call(rbind, ...)

do.call(rbind, c(unlist(list1, recursive = FALSE), make.row.names = FALSE))
#    A  B
#1   1 30
#2   2 29
#3   3 28
#4   4 27
#5   5 26
#6   6 25
#7   7 24
#8   8 23
#9   9 22
#10 10 21
#11 11 20
# ...

make.row.names = FALSE также передается на rbind.


Если скорость имеет значение, вы можете использовать data.table

data.table::rbindlist(unlist(list1, recursive = FALSE))

tidyverse путь будет

dplyr::bind_rows(purrr::flatten(list1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...