将具有各种长度向量的列表转换为 R 中的 data.frame 的最简单方法

The simplest way to convert a list with various length vectors to a data.frame in R

这里我有一个包含不同长度向量的列表。我想要 data.frame。我在 SO 中看到了很多关于它的帖子(参见 ref),但是其中 none 和我预期的一样简单,因为这确实是数据预处理中的常见任务。谢谢。

这里最简单的意思是 as.data.frame(aa) 如果有效。因此,R 的基础包中的一个函数会很棒。 sapply(aa, "length<-", max(lengths(aa)))其实有四个功能。

示例如下。

输入:

aa <- list(A=c(1, 3, 4), B=c(3,5,7,7,8))

输出:

A B
1 3
3 5
4 7
NA 7
NA 8

A 和 B 是 data.frame 的同名。

一个答案是 sapply(aa, '[', seq(max(sapply(aa, length)))),但它也很复杂。

参考:

  1. How to convert a list consisting of vector of different lengths to a usable data frame in R?

  2. Combining (cbind) vectors of different length

我们可以使用

data.frame(lapply(aa, "length<-", max(lengths(aa))))

创建这个函数:

listToDF <- function(aa){
  sapply(aa, "length<-", max(lengths(aa)))
 }

那就用吧,简单的:

listToDF(aa)

使用 tidyverse 包。将列表放在嵌套数据框中。为列表中的每个向量提取 name。取消嵌套数据框。给每个向量中的每个元素一个行索引i,以宽格式传播数据

    aa <- list(A = c(1, 3, 4), B = c(3, 5, 7, 7, 8))
    library(tidyverse)
    data_frame(data = aa) %>% 
        group_by(name = names(data)) %>% 
        unnest() %>%
        mutate(i = row_number()) %>% 
        spread(name, data)
    # A tibble: 5 x 3
          i     A     B
    * <int> <dbl> <dbl>
    1     1     1     3
    2     2     3     5
    3     3     4     7
    4     4    NA     7
    5     5    NA     8