gpt4 book ai didi

R:重新列出平面列表

转载 作者:行者123 更新时间:2023-12-04 12:03:32 25 4
gpt4 key购买 nike

This question有一个很好的扁平列表解决方案,同时保留其数据类型(unlist 没有):

flatten = function(x, unlist.vectors=F) {
while(any(vapply(x, is.list, logical(1)))) {
if (! unlist.vectors)
x = lapply(x, function(x) if(is.list(x)) x else list(x))
x = unlist(x, recursive=F)
}
x
}

如果我给它以下列表,它会按预期运行:
> a = list(c(1,2,3), list(52, 561), "a")
> flatten(a)
[[1]]
[1] 1 2 3

[[2]]
[1] 52

[[3]]
[1] 561

[[4]]
[1] "a"

现在我想像 a 一样重组平面列表. relist惨败:
> relist(flatten(a), skeleton=a)
[[1]]
[[1]][[1]]
[1] 1 2 3

[[1]][[2]]
[1] 52

[[1]][[3]]
[1] 561

[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
[1] "a"

[[2]][[2]]
[[2]][[2]][[1]]
NULL

[[3]]
[[3]][[1]]
NULL

现在,我当然可以做 relist(unlist(b), a)但这又会丢失数据类型。重组平面列表的好方法是什么?

如果它处理与 unlist.vectors 类似的属性,则加分。正确。

最佳答案

一种方法是:

relist2 = function(x, like, relist.vectors=F) {
if (! relist.vectors)
like = rapply(a, function(f) NA, how='replace')
lapply(relist(x, skeleton=like), function(e) unlist(e, recursive=F))
}

这保留了类并区分列表和向量:
> relist2(flatten(a), like=a)
[[1]]
[1] 1 2 3

[[2]]
[[2]][[1]]
[1] 52

[[2]][[2]]
[1] 561

[[3]]
[1] "a"

> relist2(flatten(a, unlist.vectors=T), like=a, relist.vectors=T)
[[1]]
[1] 1 2 3

[[2]]
[[2]][[1]]
[1] 52

[[2]][[2]]
[1] 561

[[3]]
[1] "a"

关于R:重新列出平面列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23056133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com