Сделать фрейм данных из списка списков, но каждый элемент столбца - PullRequest
4 голосов
/ 11 февраля 2020

Я хотел бы создать фрейм данных из списка списков, в котором результирующий фрейм данных имеет столбец для каждого элемента, а строки - индивидуальные. Это сложно объяснить, поэтому я попытаюсь привести пример для работы.

Допустим, мой список выглядит следующим образом:

myList <- list(
  list(L=c(1,2,3),a=c(1,2,3),b=c(1,2,3)),
  list(L=c(4,5,6),a=c(4,5,6),b=c(4,5,6)),
  list(L=c(7,8,9),a=c(7,8,9),b=c(7,8,9)))

Полученный кадр данных будет выглядеть так:

df <- data.frame(ind = c(1,2,3),
  L.1 = c(1,4,7),L.2 = c(2,5,8), L.3 = c(3,6,9),
  a.1 = c(1,4,7),a.2 = c(2,5,8), a.3 = c(3,6,9),
  b.1 = c(1,4,7),b.2 = c(2,5,8), b.3 = c(3,6,9))

Я пытался использовать

data.frame(do.call(rbind, myList))

df <- bind_rows(myList, .id="column_label")

, но они дают три строки на человека, а не желаемый результат.

Я также пытался использовать : df <- bind_cols(myList) но это делит столбцы на каждый список.

Есть идеи, как go об этом?

Спасибо, Ева

Ответы [ 4 ]

5 голосов
/ 11 февраля 2020

Если имена всегда совпадают одно за другим, вы можете просто сделать:

do.call(rbind, lapply(myList, unlist))
#     L1 L2 L3 a1 a2 a3 b1 b2 b3
#[1,]  1  2  3  1  2  3  1  2  3
#[2,]  4  5  6  4  5  6  4  5  6
#[3,]  7  8  9  7  8  9  7  8  9
2 голосов
/ 11 февраля 2020

Вы также можете транспонировать после использования sapply() в unlist():

as.data.frame(t(sapply(myList, unlist)))
  L1 L2 L3 a1 a2 a3 b1 b2 b3
1  1  2  3  1  2  3  1  2  3
2  4  5  6  4  5  6  4  5  6
3  7  8  9  7  8  9  7  8  9
2 голосов
/ 11 февраля 2020

Один purrr параметр может быть:

myList %>%
 map_df(~ bind_rows(unlist(.)))

  L1 L2 L3 a1 a2 a3 b1 b2 b3
1  1  2  3  1  2  3  1  2  3
2  4  5  6  4  5  6  4  5  6
3  7  8  9  7  8  9  7  8  9

Включая также столбец ind с добавлением dplyr:

myList %>%
 map_df(~ bind_rows(unlist(.))) %>%
 mutate(ind = 1:n())
0 голосов
/ 11 февраля 2020
librayr(purrr) # load the purrr library
library(magrittr) # load the magrittr library
myList %>% 
    map(unlist) %>% # for each element of myList, apply the unlist function which makes it a vector of 9 floats.
    map(as.list) %>% # transform this vector into a list
    map_dfr(data.frame) # and then transofrm this list into a data.frame row.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...