Как построить фрейм данных из вложенного списка в R - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть функция, которая запрашивает базу данных и возвращает список из двух фреймов данных (df1 и df2).Если я итеративно повторю эту функцию, я возвращаю список вложенных списков с двумя фреймами данных.

Результирующий список имеет следующую структуру:

#e.g. sample list of lists of 2 data frames
A1 <- data.frame(Value =c("A","B","C"))
A2 <- data.frame(Value =c("1","2","3"))
B1 <- data.frame(Value =c("D","E","F"))
B2 <- data.frame(Value =c("4","5","6"))
C1 <- data.frame(Value =c("G","H","I"))
C2 <- data.frame(Value =c("7","8","9"))
myList <- list( list(df1 = A1, df2 = A2),
            list(df1 = B1, df2 = B2),
            list(df1 = C1, df2 = C2))

Затем я хочу объединитьфреймы данных в свои отдельные большие фреймы данных - df1_All и df2_All.

Как извлечь все фреймы данных df1 из списка и объединить их в больший фрейм данных?Я думаю, что было бы использовать использовать конструкцию do.call (rbind) с функцией apply или map, примененной к myList?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Исходя из комментария Ронака Шаха к моему вопросу, я ответил на этот вопрос:

dfX1 <- data.frame(do.call("rbind",lapply(myList,"[[","df1")))
dfX2 <- data.frame(do.call("rbind",lapply(myList,"[[","df2"))) 
0 голосов
/ 20 декабря 2018
myList %>% 
   pmap(.,bind_rows) %>% 
   bind_cols()
  Value Value1
1     A      1
2     B      2
3     C      3
4     D      4
5     E      5
6     F      6
7     G      7
8     H      8
9     I      9
0 голосов
/ 20 декабря 2018

Редактировать: следующий код не создает требуемый вывод (ОП уточнил предполагаемый вывод после того, как я его составил)

Давайте создадим пользовательскую функцию.Кажется, что ваши фреймы данных находятся в одинаковом положении, поэтому давайте воспользуемся этой регулярностью:

getDataFrame <- function(mylist, wantx) {
  df <- sapply(myList, `[[`, wantx)
  names(df) <- paste0("Name", seq(1:length(mylist)))
  df <- as_tibble(df)
  return(df)
}

Итак,

getDataFrame(myList, 1)

возвращает:

# A tibble: 3 x 3
  Name1 Name2 Name3
  <fct> <fct> <fct>
1 A     D     G    
2 B     E     H    
3 C     F     I 

И аналогично:

> getDataFrame(myList, 2)
# A tibble: 3 x 3
  Name1 Name2 Name3
  <fct> <fct> <fct>
1 1     4     7    
2 2     5     8    
3 3     6     9    

Если вы не хотите, чтобы они были факторами, вам придется конвертировать их впоследствии.Надеюсь, это поможет.

...