2015-06-23 5 views
0

У меня есть список списков, и я хочу преобразовать его в dataframe. Задача состоит в том, что в списках отсутствуют имена переменных (не NA, а переменная отсутствует).LIst из списков в R в data.frame - непоследовательные имена переменных

Чтобы проиллюстрировать на примере: от

my_list <- list() 
my_list[[1]] <- list(a = 1, b = 2, c = 3) 
my_list[[2]] <- list(a = 4, c = 6) 

Я хотел бы получить

 a b c 
[1,] 1 2 3 
[2,] 4 NA 6 

ответ

1

Вы можете использовать функцию bind_rows из dplyr пакета:

my_list <- list() 
my_list[[1]] <- list(a = 1, b = 2, c = 3) 
my_list[[2]] <- list(a = 4, c = 6) 
dplyr::bind_rows(lapply(my_list, as.data.frame)) 

Это выходы:

Source: local data frame [2 x 3] 
    a b c 
1 1 2 3 
2 4 NA 6 
+3

Или 'data.table :: rbindlist (lapply (my_list, as.data.frame), fill = TRUE) ' –

+0

@DavidArenburg Возможно, вы захотите добавить свое замечательное предложение [** this Q & A **] (http://stackoverflow.com/questions/3402371/rbind-different-number - столбцы), которые кажутся возможными каноническими ответами на подобные вопросы. – Henrik

2

Другой вариант

library(reshape2) 
as.data.frame(acast(melt(my_list), L1~L2, value.var='value')) 
# a b c 
#1 1 2 3 
#2 4 NA 6 

Или, как предложил @David Arenburg обертка для melt/dcast будет recast

recast(my_list, L1 ~ L2, value.var = 'value')[, -1] 
# a b c 
#1 1 2 3 
#2 4 NA 6 
+2

Или, может быть, 'recast (my_list, L1 ~ L2, value.var = 'значение') [, -1]', хотя '-1' уродливо. –

+0

@DavidArenburg Спасибо, я пробовал это раньше, но нет опции с выходом матрицы acast. – akrun

+1

OP явно заявили, что хотят преобразовать его в кадр данных. –

1

Другой ответ, это требует, чтобы изменить класс аргументов данных. рамы:

library(plyr) 
lista <- list(a=1, b=2, c =3) 
listb <- list(a=4, c=6) 
lista <- as.data.frame(lista) 
listb <- as.data.frame(listb) 
my_list <- list(lista, listb) 
my_list <- do.call(rbind.fill, my_list) 
my_list 
    a b c 
1 1 2 3 
2 4 NA 6 
+0

Кстати, вы не используете примерную структуру данных, предоставляемую OP. Если вы создаете новую структуру, вы бы использовали нечто похожее, как код @ Tutuchan, а не вручную меняя/создавая. – akrun

+0

Только что заметили, вы правы. – erasmortg

+1

Это способ ручной. ОП уже предоставил данные. Все, что вам нужно сделать, это просто 'my_list <- lapply (my_list, as.data.frame); do.call (rbind.fill, my_list) ' –

Смежные вопросы