У меня есть список, который выглядит так

[[1]]
[1] 1

[[2]]
[1] 2 3 4

[[3]]
[1] 5 6

Я хотел бы превратить его в такой фрейм данных

   A B C
1  1 
2  2 3 4 
3  5 6

К сожалению, я не знаю, как это сделать.

Кто-нибудь может дать мне ответ, пожалуйста? Спасибо

0
JMCrocs 7 Окт 2020 в 15:34

2 ответа

Лучший ответ

Вы можете попробовать приведенный ниже код

data.frame(t(sapply(lst,`length<-`,max(lengths(lst)))))

Или

data.frame(do.call(rbind,lapply(lst,`length<-`,max(lengths(lst)))))

Давая

  X1 X2 X3
1  1 NA NA
2  2  3  4
3  5  6 NA

Данные

lst <- list(1, 2:4, 5:6)

Обновить

Кажется, у вас есть NULL в lst. В этом случае вы можете попробовать приведенный ниже код

data.frame(do.call(rbind,lapply(replace(lst,!lengths(lst),NA),`length<-`,max(lengths(lst)))))

Или

data.frame(t(sapply(replace(lst,!lengths(lst),NA),`length<-`,max(lengths(lst)))))

Пример Учитывая lst как

lst <- list(1,2:4,5:6,NULL,1:4)

> lst
[[1]]
[1] 1

[[2]]
[1] 2 3 4

[[3]]
[1] 5 6

[[4]]
NULL

[[5]]
[1] 1 2 3 4

Мы получим

> data.frame(do.call(rbind,lapply(replace(lst,!lengths(lst),NA),`length<-`,max(lengths(lst))))) 
  X1 X2 X3 X4
1  1 NA NA NA
2  2  3  4 NA
3  5  6 NA NA
4 NA NA NA NA
5  1  2  3  4

> data.frame(t(sapply(replace(lst,!lengths(lst),NA),`length<-`,max(lengths(lst)))))
  X1 X2 X3 X4
1  1 NA NA NA
2  2  3  4 NA
3  5  6 NA NA
4 NA NA NA NA
5  1  2  3  4
2
ThomasIsCoding 7 Окт 2020 в 21:01

Вы также можете использовать dplyr bind_rows() с этим трюком (большое спасибо я использовал данные из @ThomasIsCoding ):

library(dplyr)
#Code
df <- bind_rows(lapply(lst,function(x)as.data.frame(t(x))))

Выход:

  V1 V2 V3
1  1 NA NA
2  2  3  4
3  5  6 NA
1
Duck 7 Окт 2020 в 13:03