如何展平嵌套列表保持内部结构

Álv*_*gas 0 r list dplyr

假设我有以下列表 ( result),它是一个嵌套列表,用于从模型中捕获信息:参数 ( betas) 及其标准误差 ( sd),此外还有一些关于全局模型 ( method) 和观察数量 ( n) 的信息。

我想拼合名单betas,并sd同时区分其中的每一个值x1x2来自(即,如果它们是从betassd)。

请仔细考虑以下示例:

result<- list(n       = 100,
              method  = "tree", 
              betas   = list(x1 = 1.47,
                             x2 = -2.85),
              sd      = list(x1 = 0.55,
                             x2 = 0.25))

str(result)
# List of 4
# $ n         : num 100
# $ iterations: num 50
# $ betas     :List of 2
# ..$ x1: num 1.47
# ..$ x2: num -2.85
# $ sd        :List of 2
# ..$ x1: num 0.55
# ..$ x2: num 0.25
Run Code Online (Sandbox Code Playgroud)

第一次尝试:flatten()。[剧透(!):我失去了每个值的优先级]

## I can't distinguish between betas and sd.
flatten(result)

# $n
# [1] 100
# 
# $iterations
# [1] 50
# 
# $x1
# [1] 1.47
# 
# $x2
# [1] -2.85
# 
# $x1
# [1] 0.55
#
# $x2
# [1] 0.25

Run Code Online (Sandbox Code Playgroud)

第二次尝试:unlist()。[剧透(!),我需要一个列表,而不是一个原子向量]

#I need a list 
unlist(result)

# n iterations   betas.x1   betas.x2      sd.x1      sd.x2 
# 100.00      50.00       1.47      -2.85       0.55       0.25 

Run Code Online (Sandbox Code Playgroud)

所需的输出。

list(n        = 100,
    method   = "tree", 
    betas.x1 = 1.47,
    betas.x2 = -2.85,
    sd.x1    = 0.55,
    sd.x2    = 0.25)

# List of 6
# $ n       : num 100
# $ method  : chr "tree"
# $ betas.x1: num 1.47
# $ betas.x2: num -2.85
# $ sd.x1   : num 0.55
# $ sd.x2   : num 0.25
Run Code Online (Sandbox Code Playgroud)

r2e*_*ans 5

as.data.frame会为你变平。来自?as.data.frame

通过在第一个维度之后“展平”所有维度并创建合适的列标签,将具有两个以上维度的数组转换为矩阵。

这在解释它也对嵌套列表进行操作方面做得很差,而不仅仅是对数组进行操作。(换句话说,我认为文档没有在非数组上讨论这个特性。)

str(as.data.frame(result))
# 'data.frame': 1 obs. of  6 variables:
#  $ n       : num 100
#  $ method  : chr "tree"
#  $ betas.x1: num 1.47
#  $ betas.x2: num -2.85
#  $ sd.x1   : num 0.55
#  $ sd.x2   : num 0.25
Run Code Online (Sandbox Code Playgroud)

如果你不想要/需要一个listas.list接下来就是:

str(as.list(as.data.frame(result)))
# List of 6
#  $ n       : num 100
#  $ method  : chr "tree"
#  $ betas.x1: num 1.47
#  $ betas.x2: num -2.85
#  $ sd.x1   : num 0.55
#  $ sd.x2   : num 0.25
Run Code Online (Sandbox Code Playgroud)