#r #dataframe #data-manipulation #nested-lists
#r #фрейм данных #манипулирование данными #вложенные списки
Вопрос:
Мой вопрос связан с преобразованием списка вложенных списков фреймов данных в один фрейм данных.
Для простого примера давайте используем iris
dataset .
#import of library
library(purrr)
#import of the dataset
data(iris)
#creation of lists
lst=list(`0`=list(`1`=iris[1:5,]),`18`=c(`1`=list(iris[1:5,]),`2`=list(iris[1:5,])))
Как я могу объединить все фреймы данных вложенных списков в один фрейм данных?
Комментарии:
1. @Anas. S Можете ли вы создать минимально воспроизводимый пример?
2. @Pablo Rod Я попробовал и получил это сообщение «Ошибка в bind_rows_(x, .id): аргумент 1 не может быть списком, содержащим фреймы данных»
Ответ №1:
Сначала выполните цикл внутри 0, 18, а bind_rows
затем используйте map_dfr
для связывания строк более высокого элемента, т.е. Для связывания 0 и 18 вместе.
library(purrr)
lst=list(`0`=list(`1`=iris[1:5,]),`18`=c(`1`=list(iris[1:5,]),`2`=list(iris[1:5,])))
map_dfr(ls,~bind_rows(.,.id='id'))
#OR
bind_rows(unlist(lst,recursive = FALSE),.id = 'id')
Другим вариантом сохранения является использование unlist
и purrr::imap
для создания идентификатора столбца, представляющего полный путь к каждому фрейму данных
imap_dfr(unlist(lst,recursive = FALSE), ~data.frame(id=.y, .x, stringsAsFactors = FALSE))
id Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 0.1 5.1 3.5 1.4 0.2 setosa
2 0.1 4.9 3.0 1.4 0.2 setosa
3 0.1 4.7 3.2 1.3 0.2 setosa
4 0.1 4.6 3.1 1.5 0.2 setosa
5 0.1 5.0 3.6 1.4 0.2 setosa
6 18.1 5.1 3.5 1.4 0.2 setosa
7 18.1 4.9 3.0 1.4 0.2 setosa
8 18.1 4.7 3.2 1.3 0.2 setosa
9 18.1 4.6 3.1 1.5 0.2 setosa
10 18.1 5.0 3.6 1.4 0.2 setosa
11 18.2 5.1 3.5 1.4 0.2 setosa
12 18.2 4.9 3.0 1.4 0.2 setosa
13 18.2 4.7 3.2 1.3 0.2 setosa
14 18.2 4.6 3.1 1.5 0.2 setosa
15 18.2 5.0 3.6 1.4 0.2 setosa