首页 > 解决方案 > 将 List 转换为 Matrix 或 Tibble 格式的最佳方法?

问题描述

我正在寻找一种体面的方法来将函数的输出作为列表转换为矩阵或 tibble 格式。

以下 tibble 输入到一个函数中。该函数返回一个列表。在这个简单的示例中,返回的列表恰好包含与函数输入 tibble 相同的值。

# # A tibble: 6 x 15
#         rev   CoS    gm   sga ebitda    bd  ebit    ie    ii  gain   ebt chg_DTL   current   tax    ni
#       <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl>     <dbl> <dbl> <dbl>
#     1     0     0     0     0      0     0     0     0     0     0     0       0         0     0     0
#     2     0     0     0     0      0     0     0     0     0     0     0       0         0     0     0
#     3     0     0     0     0      0     0     0     0     0     0     0       0         0     0     0
#     4     0     0     0     0      0     0     0     0     0     0     0       0         0     0     0
#     5     0     0     0     0      0     0     0     0     0     0     0       0         0     0     0
#     6     0     0     0     0      0     0     0     0     0     0     0       0         0     0     0

这是从函数返回的列表。

> ni_out
$rev
[1] 0 0 0 0 0 0

$CoS
[1] 0 0 0 0 0 0

$gm
[1] 0 0 0 0 0 0

$sga
[1] 0 0 0 0 0 0

$ebitda
[1] 0 0 0 0 0 0

$bd
[1] 0 0 0 0 0 0

$ebit
[1] 0 0 0 0 0 0

$ie
[1] 0 0 0 0 0 0

$ii
[1] 0 0 0 0 0 0

$gain
[1] 0 0 0 0 0 0

$ebt
[1] 0 0 0 0 0 0

$chg_DTL_net
[1] 0 0 0 0 0 0

$current
[1] 0 0 0 0 0 0

$tax
[1] 0 0 0 0 0 0

$ni
[1] 0 0 0 0 0 0


我希望将其转换回更令人愉悦的内容,例如原始 tibble 格式或矩阵。

我获得了列表输出的维度。

lengths(ni_out)[[1]]
# [1] 6

> length(ni_out)
# [1] 15

但是,我对矩阵的不成功尝试如下所示。

as.matrix(unlist(ni_out), nrow = lengths(ni_out)[[1]], ncol = length(ni_out))
# [,1]
# rev1            0
# rev2            0
# rev3            0
# rev4            0
# rev5            0
# rev6            0
# CoS1            0
# CoS2            0
# CoS3            0
# CoS4            0
# CoS5            0
# CoS6            0
# gm1             0
# gm2             0
# gm3             0
# gm4             0
# gm5             0
# gm6             0
# sga1            0
# sga2            0
# sga3            0
# sga4            0
# sga5            0
# sga6            0
# ebitda1         0
# ebitda2         0
#         etc.

矩阵或小标题格式的想法?

标签: r

解决方案


下次请提供一个可重现的例子。

如果您的列表被调用mylist,我会尝试data.table::rbindlist(mylist)

请参阅下面的示例,包括将向量转换为data.frames.

dat <- 0:5
mylist <- list(dat, dat, dat)
mylist <- lapply(mylist, function(x) data.frame(t(x)))
data.table::rbindlist(mylist)
> data.table::rbindlist(mylist)
X1 X2 X3 X4 X5 X6
1:  0  1  2  3  4  5
2:  0  1  2  3  4  5
3:  0  1  2  3  4  5

编辑:似乎你想cbind代替rbind,所以在这种情况下我会使用下面的。

dat <- 0:5
mylist <- list(dat, dat, dat)
mylist <- lapply(mylist, function(x) data.frame(x))
dplyr::bind_cols(mylist)
x...1 x...2 x...3
1     0     0     0
2     1     1     1
3     2     2     2
4     3     3     3
5     4     4     4
6     5     5     5

正如您所看到的,答案因您的需求而异,因此提供一个示例很重要。


推荐阅读