r语言 - 重铸任意深度的嵌套列表



假设这个简化的例子:

L <- list()
L$Foo <- list()
L$Foo$Bar <- list()
L$Foo$Bar$VAR <- TRUE
L$Lorem <- list()
L$Lorem$Ipsum <- list()
L$Lorem$Ipsum$Dolor <- list()
L$Lorem$Ipsum$Dolor$VAR <- TRUE

然后我将用reshape2::melt(L)熔化这个列表。它将输出以下内容:

value    L3    L2   L4    L1
1  TRUE   VAR   Bar <NA>   Foo
2  TRUE Dolor Ipsum  VAR Lorem

在对值列中的某些单元格进行一些操作后,我希望将这个熔化的列表重铸为与L完全相同的嵌套列表结构-唯一的区别是我更新了一些value实例。

有什么办法吗?请记住,嵌套列表的深度可以是任意的,而且是不同的。

一个选项是relist,在我们unlistL之后

tmp <- unlist(L)
# make small changes
tmp[] <- FALSE
relist(tmp, L)

结果

$Foo
$Foo$Bar
$Foo$Bar$VAR
[1] FALSE

$Lorem
$Lorem$Ipsum
$Lorem$Ipsum$Dolor
$Lorem$Ipsum$Dolor$VAR
[1] FALSE

Llook like

$Foo
$Foo$Bar
$Foo$Bar$VAR
[1] TRUE

$Lorem
$Lorem$Ipsum
$Lorem$Ipsum$Dolor
$Lorem$Ipsum$Dolor$VAR
[1] TRUE

另一种选择是在rrapply-包中使用rrapply(),该包具有how = "melt"how = "unmelt"选项,可以在嵌套列表和熔化数据之间进行转换:

library(rrapply)
L <- list(Foo = list(Bar = list(VAR = TRUE)), Lorem = list(Ipsum = list(Dolor = list(VAR = TRUE))))
## melt to data.frame
(L1 <- rrapply(L, how = "melt"))
#>      L1    L2    L3   L4 value
#> 1   Foo   Bar   VAR <NA>  TRUE
#> 2 Lorem Ipsum Dolor  VAR  TRUE
## cast back to nested list
L2 <- rrapply(L1, how = "unmelt")
str(L2)
#> List of 2
#>  $ Foo  :List of 1
#>   ..$ Bar:List of 1
#>   .. ..$ VAR: logi TRUE
#>  $ Lorem:List of 1
#>   ..$ Ipsum:List of 1
#>   .. ..$ Dolor:List of 1
#>   .. .. ..$ VAR: logi TRUE
identical(L2, L)
#> [1] TRUE

关于relist()的一个重要优点是不需要列表骨架对象(参见?relist),所以当修改融化的数据帧时,我们不受骨架对象中定义的列表格式的约束,例如:

L_unlist <- unlist(as.relistable(L))
## this change has no effect when relisting
## as the original list is used as skeleton
names(L_unlist)[1] <- "Foo.Bar.Test"
relist(L_unlist)
#> $Foo
#> $Foo$Bar
#> $Foo$Bar$VAR
#> [1] TRUE
#> 
#> $Lorem
#> $Lorem$Ipsum
#> $Lorem$Ipsum$Dolor
#> $Lorem$Ipsum$Dolor$VAR
#> [1] TRUE
#> 
#> attr(,"class")
#> [1] "relistable" "list"
## here it does behave as expected
L_melt <- rrapply(L, how = "melt")
L_melt[1, "L3"] <- "Test"
rrapply(L_melt, how = "unmelt")
#> $Foo
#> $Foo$Bar
#> $Foo$Bar$Test
#> [1] TRUE
#> 
#> $Lorem
#> $Lorem$Ipsum
#> $Lorem$Ipsum$Dolor
#> $Lorem$Ipsum$Dolor$VAR
#> [1] TRUE

相关内容

  • 没有找到相关文章

最新更新