在rrapply::rrapply()中保留空列表

lawou6xi  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(216)

是否有一个选项允许我在how="melt"选项中保留具有长度为0的列表的值的列表条目?在下面,我想保留BE条目。
注意:@akrun给出了一个初始解决方案,当我在这里有一个更简单的reprex时(我在原始的E处没有0长度的列表)。我最初接受了,意识到我需要一个更复杂的例子,并使用@akrun的解决方案作为我下面接受的解决方案的基础。

library(rrapply)
lst <- list(A=1, B=list(), C=list(D=letters[1:3], E=list()))
str(lst)
#> List of 3
#>  $ A: num 1
#>  $ B: list()
#>  $ C:List of 2
#>   ..$ D: chr [1:3] "a" "b" "c"
#>   ..$ E: list()

# Melting it drops things that has 0-length lists, like B and E:
rrapply(lst, how="melt")
#>   L1   L2   value
#> 1  A <NA>       1
#> 2  C    D a, b, c

创建于2023-04-27带有reprex v2.0.2

roqulrg3

roqulrg31#

空列表元素可以递归地更改为NA,然后是melt

rrapply(lst, classes = "list", f = \(x) if(!length(x)) NA else x) |>
    rrapply(how = "melt")
  • 输出
L1   L2   value
1  A <NA>       1
2  B <NA>      NA
3  C    D a, b, c
xfb7svmp

xfb7svmp2#

答案,基于@akrun上面的解决方案。

library(rrapply)
lst <- list(A=1, B=list(), C=list(D=letters[1:3], E=list()))
str(lst)
#> List of 3
#>  $ A: num 1
#>  $ B: list()
#>  $ C:List of 2
#>   ..$ D: chr [1:3] "a" "b" "c"
#>   ..$ E: list()

# Melting it drops things that has 0-length lists, like B and E:
rrapply(lst, how="melt")
#>   L1   L2   value
#> 1  A <NA>       1
#> 2  C    D a, b, c

#;; Here is how you can retain those entries that have 0-length lists, but
#;; you have to change the 0-length list to NA:
rrapply(lst, classes = "list"
        , condition = \(x) length(x) == 0
        , f = \(x) NA
        , how="recurse") |>
    rrapply(how="melt")
#>   L1   L2   value
#> 1  A <NA>       1
#> 2  B <NA>      NA
#> 3  C    D a, b, c
#> 4  C    E      NA

创建于2023-04-27带有reprex v2.0.2

相关问题