R将可变长度向量的R列表转换为数据帧

时间:2018-09-19 12:55:44

标签: r

我在网站上看到了这个问题的几种变体,但没有发现这个特殊问题。

我创建了一个未命名的数字向量列表。每个向量的长度是变化的。例如,前几个条目可能看起来像:

data[[1]]
1 2 3

data[[2]]
1 2 3 4

data[[3]]
1 3

我正在尝试将其导出为表格格式,因此我试图将其转换为类似于以下内容的数据框:

1  2  3  NA
1  2  3  4
1  3  NA NA

我尝试了各种方法,例如do.call,rbindlist和as.data.frame。我也尝试过将数据集创建为列表列表而不是向量列表。

谢谢您的任何建议。

3 个答案:

答案 0 :(得分:1)

使用tidyverse:

l <- list(c(1,2,3,4),c(1,2,3),c(1,3))
data.frame(x=I(l)) %>% 
  mutate(id=row_number()) %>% 
  unnest %>% 
  group_by(id) %>% mutate(k=paste0("V",row_number())) %>% 
  spread(k,x) %>% select(-id)
#     V1    V2    V3    V4
#  <dbl> <dbl> <dbl> <dbl>
#1     1     2     3     4
#2     1     2     3    NA
#3     1     3    NA    NA

答案 1 :(得分:0)

将列表放在嵌套的数据框中。为列表中的每个向量添加行索引i,使数据框保持嵌套。为每个向量中的每个元素赋予列索引j,以宽格式散布数据。

library(tidyverse)
l <- list(c(1,2,3),c(1,2,3,4),c(1,3))
data_frame(data = l) %>%
    mutate(i = row_number()) %>% 
    unnest() %>% 
    group_by(i) %>% 
    mutate(j = paste0("x", 1:n())) %>% 
    spread(j, data)
# A tibble: 3 x 5
# Groups:   i [3]
i    x1    x2    x3    x4
* <int> <dbl> <dbl> <dbl> <dbl>
1     1     1     2     3    NA
2     2     1     2     3     4
3     3     1     3    NA    NA

答案 2 :(得分:0)

尼古拉(Nicola)的答案就像一个咒语,是迄今为止我所见过的最简单的答案。谢谢!

do.call(rbind,lapply(data,function(x) "length<-"(x,max(lengths(data)))))