将列表列表转换为数据框

时间:2019-01-29 21:17:18

标签: r dataframe

我有一个函数,该函数首先生成向量列表(通过使用lapply生成),然后将其绑定到列向量。我认为这会产生一个数据框。但是,它会产生一个列表列表。

cbind函数无法正常运行。

这是函数生成内容的一个小例子

col_test <- c(1, 2, 1, 1, 2)
lst_test <- list(c(1, 2 , 3), c(2, 2, 2), c(1, 1, 2), c(1, 2, 2), c(1, 1, 1))
a_df <- cbind(col_test, lst_test)

输入

> a_df[1,]

提供输出

$`col_test`
[1] 1

$lst_test
[1] 1 2 3

我希望数据框为

     [,1] [,2] [,3] [,4]
[1,] 1    1    2    3

[2,] 2    2    2    2

[3,] 1    1    1    2

[4,] 1    1    2    2

[5,] 2    1    1    1

如何将其转换成这种形式?

4 个答案:

答案 0 :(得分:1)

这应该可以解决问题。请注意,我们正在使用do.call,以便将lst_test的各个元素作为参数发送到cbind,这可以防止cbind创建列表列表。 t用于将结果矩阵转置为您首选的方向,最后,再用cbind的另一个col_test也会插入该数据。

library(tidyverse)

mat.new <- do.call(cbind, lst_test) %>% 
  t %>% 
  cbind(col_test, .) %>% 
  unname

     [,1] [,2] [,3] [,4]
[1,]    1    1    2    3
[2,]    2    2    2    2
[3,]    1    1    1    2
[4,]    1    1    2    2
[5,]    2    1    1    1

答案 1 :(得分:1)

data.frame(col_test,t(as.data.frame(lst_test)))

答案 2 :(得分:1)

do.call(rbind, Map(c, col_test, lst_test))
#     [,1] [,2] [,3] [,4]
#[1,]    1    1    2    3
#[2,]    2    2    2    2
#[3,]    1    1    1    2
#[4,]    1    1    2    2
#[5,]    2    1    1    1

答案 3 :(得分:1)

col_test <- c(1, 2, 1, 1, 2)
lst_test <- list(c(1, 2 , 3), c(2, 2, 2), c(1, 1, 2), c(1, 2, 2), c(1, 1, 1))

命名子列表,以便我们可以使用bind_rows

names(lst_test) <- 1:length(lst_test)   
lst_test1 <- bind_rows(lst_test)

在这种情况下,bind_rows函数由cols绑定,因此我们需要对其进行透视

lst_test_pivot <- t(lst_test1) 

但这为我们提供了一个矩阵,因此我们需要将其转换回数据框

lst_test_pivot_df <- as.data.frame(lst_test_pivot)

现在可以用作

cbind(col_test, lst_test_pivot_df)

现在生产

  col_test V1 V2 V3
1        1  1  2  3
2        2  2  2  2
3        1  1  1  2
4        1  1  2  2
5        2  1  1  1