Списки списков, преобразовать в фрейм данных в R - PullRequest
0 голосов
/ 10 марта 2019

У меня есть что-то похожее на это:

Group1 <- list(Date=c("a","b","c"), Name=c("a2","b2"), Age=c("a3","b3","c3","d3"))
Group2 <- list(Date=c("a","b","c"), Name=c("a2","b2","b3"), Age=c("a3","b3","c3","d3"))
Group3 <- list(Date=c("a","b","c"), Name=c("a2","b2"), Age=c("a3","b3"))
all <- list(Group1,Group2,Group3)
all

Мне нужно добавить NA, чтобы каждый список дат, имен и возрастов имел одинаковую длину. Затем мне нужно преобразовать это в фрейм данных.

Я застрял в том, как добавить NA, так как у меня есть списки в списках. У меня будет более 1000 «Групп» со списками данных в них (всегда одинаковые категории Дата, Имя, Возраст, поэтому эта длина не меняется). Самый длинный список в этих группах всегда должен быть 4 для текущего примера, поэтому все, что меньше, должно иметь NA. Я видел такой код, который близок, но не работает для списков в списках:

## Compute maximum length
max.length <- max(sapply(all, length))
## Add NA values to list elements
l <- lapply(all, function(v) { c(v, rep(NA, max.length-length(v)))})

Могу ли я сделать что-то подобное для моего текущего набора данных?

Ответы [ 2 ]

0 голосов
/ 10 марта 2019
names(all) <- 1:length(all) #Will help us latter in bind_rows

Перенести каждый элемент списка в допустимый фрейм данных

all_mod <- lapply(all,function(x){
           #browser()
           max.length<-max(sapply(x, length))
           data.frame(sapply(x, function(v) {c(v, rep(NA, max.length-length(v)))}), stringsAsFactors = FALSE)
           })

Наконец, связывает все элементы, используя bind_rows и используя .id для идентификации фреймов данных

library(dplyr)
bind_rows(all_mod, .id = 'ID')
0 голосов
/ 10 марта 2019

Мы могли бы попытаться объединить purrr и plyr:

plyr::ldply(purrr::map(all_list,unlist),function(x) rbind(x,NA))

Выход:

 #    .id Date1 Date2 Date3 Name1 Name2 Age1 Age2 Age3 Age4 Name3
#1     1     a     b     c    a2    b2   a3   b3   c3   d3  <NA>
#2     1  <NA>  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>  <NA>
#3     2     a     b     c    a2    b2   a3   b3   c3   d3    b3
#4     2  <NA>  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>  <NA>
#5     3     a     b     c    a2    b2   a3   b3 <NA> <NA>  <NA>
#6     3  <NA>  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>  <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...