#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) ** работает нормально.