将不均匀列表转换为 data.frame

Dar*_*sai 4 r dataframe

在简单的情况下,将偶数列表转换为数据框可以通过as.data.frame(). 例如 :

> (x1 <- list(a = 1:3, b = 4:6, c = 7:9))
> as.data.frame(x1)

#   a b c
# 1 1 4 7
# 2 2 5 8
# 3 3 6 9
Run Code Online (Sandbox Code Playgroud)

但是,如果列表中组件的长度不相等,则as.data.frame()不起作用。

> (x2 <- list(a = 1:4, b = 5:6, c = 7:11, d = 12:14))

# $a
# [1] 1 2 3 4
# $b
# [1] 5 6
# $c
# [1]  7  8  9 10 11
# $d
# [1] 12 13 14

> as.data.frame(x2) # get an error
Run Code Online (Sandbox Code Playgroud)

我想实现两个目标。一种是:

#    a  b  c  d
# 1  1  5  7 12
# 2  2  6  8 13
# 3  3 NA  9 14
# 4  4 NA 10 NA
# 5 NA NA 11 NA
Run Code Online (Sandbox Code Playgroud)

另一个是:

#   V1 V2 V3 V4 V5
# a  1  2  3  4 NA
# b  5  6 NA NA NA
# c  7  8  9 10 11
# d 12 13 14 NA NA
Run Code Online (Sandbox Code Playgroud)

我知道有一些函数或基本方法特别适用于这两种情况。请给我一点帮助。

www*_*www 5

使用tidyverse.

library(tidyverse)

x3 <- map_dfr(x2, ~as_data_frame(t(.)))
x3
# # A tibble: 4 x 5
#      V1    V2    V3    V4    V5
#   <int> <int> <int> <int> <int>
# 1     1     2     3     4    NA
# 2     5     6    NA    NA    NA
# 3     7     8     9    10    11
# 4    12    13    14    NA    NA

x4 <- as_data_frame(t(x3))
x4
# # A tibble: 5 x 4
#      V1    V2    V3    V4
#   <int> <int> <int> <int>
# 1     1     5     7    12
# 2     2     6     8    13
# 3     3    NA     9    14
# 4     4    NA    10    NA
# 5    NA    NA    11    NA
Run Code Online (Sandbox Code Playgroud)