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

时间:2015-11-09 16:10:31

标签: r list dataframe data-science

这里我有一个包含不同长度向量的列表。我想获得一个data.frame。我在SO中看过很多关于它的帖子(参见参考资料),但是没有一个像我预期的那么简单,因为这确实是数据预处理中的常见任务。谢谢。

如果有效,这里最简单的意思是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

3 个答案:

答案 0 :(得分:6)

我们可以使用

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

答案 1 :(得分:1)

制作此功能:

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

然后使用它,简单地说:

listToDF(aa)

答案 2 :(得分:1)

使用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