Более быстрый способ повторной привязки фреймов данных из списка списков

#r #performance #lapply #rbind #do.call

#r #Производительность #lapply #повторная привязка #do.call

Вопрос:

У меня есть цикл foreach, который возвращает список списков. Каждый вложенный список представляет собой список из 3 фреймов данных, и я хочу повторно связать их с 3 разными фреймами данных. Прямо сейчас я делаю это так:

 x_final=data.frame
y_final=data.frame()
z_final=data.frame()
for(i in 1:length(big_list))
{
   x=big_list[[i]][1]
   y=big_list[[i]][2]
   z=big_list[[i]][3]
   x_final=rbind(x_final,x)
   y_final=rbind(y_final,y)
   z_final=rbind(z_final,z)
} 
 

Проблема в том, что когда длина big_list велика, этот цикл занимает много времени. Есть ли какой-либо другой способ сделать это быстрее? Любая помощь будет высоко оценена.

Комментарии:

1. А вы пробовали data.table::rbindlist(list(x_final,y_final,z_final))

2. Существует также rlist пакет, который может быть полезен: rdocumentation.org/packages/rlist/versions/0.4.6.1 См list.rbind . функцию: rdocumentation.org/packages/rlist/versions/0.4.6.1/topics /…

Ответ №1:

Одним из вариантов было бы transpose big_list использовать и bind_rows

 library(dplyr)
library(purrr)
out_lst <- transpose(big_list) %>% 
                map(bind_rows)
 

Комментарии:

1. Привет, это не работает. Не могли бы вы, пожалуйста, привести пример? Также к вашему сведению, когда я делаю class(big_list[[1]][1]), он повторяет «список», но когда я делаю class(big_list[[1]][[1]]) он возвращает «data.frame». Может быть, это причина, по которой он не работает? Спасибо

2. @ParasKarandikar Не могли бы вы, пожалуйста, обновить свой пост небольшим воспроизводимым примером, чтобы я мог его протестировать. Спасибо

3. Я попробовал это с некоторыми игрушечными данными, ваш метод работает абсолютно нормально. Однако, когда я делаю это в big_list, я получаю сообщение об ошибке «Элемент 1 ввода списка не является атомарным вектором».

4. @ParasKarandikar Это может быть связано с тем, что некоторые элементы вашего списка могут быть пустыми в этом большом списке. Можете ли вы проверить эти

5. Большое спасибо! Произошел некоторый конфликт с функцией транспонирования библиотеки data.table. После выполнения ** purrr::transpose(big_list) %>% map(bind_rows) ** работает нормально.