我有这个一层列表:
have <- list("a" = 1, "b.a" = 2, "b.b" = 3)
我需要这个 2 层列表:
need <- list("a" = 1, "b" = list("a" = 2, "b" = 3))
如果解决方案可以递归就更好了。目标是结构化数据,因为它可以解析为某些 Json 文件。
谢谢你!
这个递归函数应该可以解决问题:
f <- function(obj) {
nms <- lapply(strsplit(names(obj), '\\.'), function(x){
if(length(x) == 1) x else c(x[1], paste(x[-1], collapse = '.'))
})
first_nms <- sapply(nms, `[`, 1)
last_nms <- sapply(nms, `[`, -1)
un_nms <- unique(first_nms)
setNames(lapply(un_nms, function(x) {
o <- unname(obj[first_nms %in% x])
if(length(o) == 1) unlist(o) else
f(setNames(o, last_nms[first_nms %in% x]))
}), un_nms)
}
测试,我们有:
have <- list("a" = 1, "b.a" = 2, "b.b" = 3)
f(have)
#> $a
#> [1] 1
#>
#> $b
#> $b$a
#> [1] 2
#>
#> $b$b
#> [1] 3
我们可以看到它适用于深度嵌套的列表:
f(list(a = 1, b.a = 2, b.b = 3, c.a.a = 4, c.a.b = 5, c.b.a = 6, c.b.b = 7))
#> $a
#> [1] 1
#>
#> $b
#> $b$a
#> [1] 2
#>
#> $b$b
#> [1] 3
#>
#>
#> $c
#> $c$a
#> $c$a$a
#> [1] 4
#>
#> $c$a$b
#> [1] 5
#>
#>
#> $c$b
#> $c$b$a
#> [1] 6
#>
#> $c$b$b
#> [1] 7