将列表转换为R中的数据帧

时间:2018-03-31 18:36:10

标签: r list dataframe

所以我有一个清单,说:

L1 <- list(1:10, 5:14, 10:19)

现在我试图将列表的输出作为数据帧,以便我的输出看起来:

 1. 1  2  3  4  5  6  7  8  9 10
 2. 5  6  7  8  9 10 11 12 13 14
 3. 10 11 12 13 14 15 16 17 18 19

我正在使用

as.data.frame(L1, row.names = TRUE)

list_vect2df(L1)

但他们都没有提供所需的输出

4 个答案:

答案 0 :(得分:1)

以下是使用包中的tas.data.framemap_dfr的想法。

L1 <- list(1:10, 5:14, 10:19)

library(purrr)

map_dfr(L1, ~as.data.frame(t(.x)))
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  1  2  3  4  5  6  7  8  9  10
# 2  5  6  7  8  9 10 11 12 13  14
# 3 10 11 12 13 14 15 16 17 18  19

同样的想法,但完全在基础R。

do.call(rbind, lapply(L1, function(x) as.data.frame(t(x))))
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  1  2  3  4  5  6  7  8  9  10
# 2  5  6  7  8  9 10 11 12 13  14
# 3 10 11 12 13 14 15 16 17 18  19

使用as.data.frame两次的另一个基础R想法。我们可以稍后更改行名称。

as.data.frame(t(as.data.frame(L1)))
#        V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# X1.10   1  2  3  4  5  6  7  8  9  10
# X5.14   5  6  7  8  9 10 11 12 13  14
# X10.19 10 11 12 13 14 15 16 17 18  19

最后,同样的想法,但使用中的transpose函数。

data.table::transpose(as.data.frame(L1))
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1  1  2  3  4  5  6  7  8  9  10
# 2  5  6  7  8  9 10 11 12 13  14
# 3 10 11 12 13 14 15 16 17 18  19

答案 1 :(得分:1)

您可以unlist并使用matrix,然后转换为data.frame。这种情况似乎更快。

as.data.frame(matrix(unlist(L1),nrow=length(L1),byrow=TRUE)

microbenchmark::microbenchmark(
a= map_dfr(L1, ~as.data.frame(t(.x))),
b= do.call(rbind, lapply(L1, function(x) as.data.frame(t(x)))),
c= as.data.frame(t(as.data.frame(L1))),
d= data.table::transpose(as.data.frame(L1)),
e= as.data.frame(matrix(unlist(L1),nrow=length(L1),byrow=TRUE)),
times = 100,unit = "relative")

# Unit: relative
# expr       min        lq      mean    median        uq       max neval
# a  9.146545  8.548656  8.859087  8.859051  9.449237  7.265274   100
# b 13.879833 11.523000 11.433790 10.924726 10.797251 24.012107   100
# c 12.719835 10.635809 10.442108 10.229913 10.259789  7.020377   100
# d 10.439881  9.143530  9.205734  8.859026  9.176125  6.624454   100
# e  1.000000  1.000000  1.000000  1.000000  1.000000  1.000000   100

答案 2 :(得分:0)

我在 rbloggers 上找到了一个非常有用的工具。请参阅以下链接的详细信息:

https://www.r-bloggers.com/2013/01/converting-a-list-to-a-data-frame/

基本上,您可以通过以下代码获得该工具,

需要(开发工具)

source_gist(4676064)

然后,使用“as.data.frame”将列表转换为数据框。 df<-as.data.frame(list)

答案 3 :(得分:0)

另一种purrr解决方案

purrr:::reduce(L1, rbind.data.frame) 

使用 rbind 代替给出一个矩阵。