5

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

这里最简单的意思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. 如何将由不同长度的向量组成的列表转换为R中的可用数据框?

  2. 组合(cbind)不同长度的向量

4

3 回答 3

10

我们可以用

data.frame(lapply(aa, "length<-", max(lengths(aa))))
于 2015-11-10T04:25:47.043 回答
2

使用 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
于 2018-09-19T14:02:15.667 回答
1

做这个功能:

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

然后使用它,简单地说:

listToDF(aa)
于 2015-11-10T11:47:41.373 回答