【问题标题】:How can I reshape a list of list from wide to long如何从宽到长重塑列表列表
【发布时间】:2016-04-11 04:05:12
【问题描述】:

我有一个具有共同结构的列表

require(data.table)
l <- list(a1 = list(b=data.table(rnorm(3)), c=data.table(rnorm(3)), d=data.table(rnorm(3))),
          a2 = list(b=data.table(rnorm(3)), c=data.table(rnorm(3)), d=data.table(rnorm(3))))

有时lapply 更容易将结构从 2x3 列表更改为 3x2 列表,例如:

+a1---b         +b---a1
   ---c           ---a2
   ---d         +c---a1
+a2---b    to     ---a2
   ---c         +d---a1
   ---d           ---a2

有没有一种惯用的方法来做到这一点?

可以在不复制所有表(可能很大)的情况下完成吗?

【问题讨论】:

  • this
  • 我不这么认为,这是针对 data.tables 而不是列表列表(的 data.tables)

标签: r list dataframe data.table


【解决方案1】:

我认为purrr::transpose() 是您正在寻找的。​​p>

(ll = purrr::transpose(l))
# $b
# $b$a1
#            V1
# 1: -0.9615584
# 2: -0.8849469
# 3:  0.4831375
# 
# $b$a2
#            V1
# 1:  0.4634884
# 2: -0.7079083
# 3: -0.4366986
# 
# 
# $c
# $c$a1
#            V1
# 1:  0.4710617
# 2: -0.4927592
# 3: -1.3484420
# 
# $c$a2
#            V1
# 1: -0.4547821
# 2:  0.5752723
# 3:  0.6272826
# 
# 
# $d
# $d$a1
#             V1
# 1:  0.80827129
# 2: -0.03640465
# 3: -1.89417912
# 
# $d$a2
#            V1
# 1:  0.1844341
# 2:  0.4557670
# 3: -0.5714462

检查尺寸:

length(ll)
# [1] 3
sapply(ll, length)
# b c d 
# 2 2 2 

looks like its implemented in C 所以我的猜测是效率得到了相当好的优化,并且不必要的复制被最小化了。

【讨论】:

  • 我会这么认为。我想我已经回答了您的第一个问题(是否有惯用的方法来做到这一点?)。对于您的第二个问题(是否可以在不复制所有表格(可能非常大)的情况下完成?),我不确定。
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 2019-11-22
  • 2019-11-18
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2021-04-30
  • 2018-06-05
相关资源
最近更新 更多