【问题标题】:How to flatten nested list keeping inner structure如何展平嵌套列表保持内部结构
【发布时间】:2021-02-22 13:31:21
【问题描述】:

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

我想将betassd 列表展平,同时区分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

第一次尝试: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

第二次尝试: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 

所需的输出。

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

【问题讨论】:

    标签: r list dplyr


    【解决方案1】:

    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
    

    如果您不想要/不需要list,只需as.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
    

    【讨论】:

    • 谢谢你;它解决了我的问题。此外,在发布问题几分钟后,我使用了as.list(unlist(result, recursive = FALSE,use.names = T)),它产生了相同的期望输出。你有什么关于为什么更喜欢一种方法而不是另一种方法的问题吗?再次感谢。
    • 不。事实上,您的代码比as.data.frame(包括大量检查等)要快得多。如果可行,请使用您的代码:-)
    猜你喜欢
    • 2021-05-24
    • 2020-10-04
    • 2013-11-17
    • 2015-03-25
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多