gpt4 book ai didi

r - 如何从嵌套列表创建所有组合,同时使用 R 保留结构?

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

给定一个嵌套列表,如何从其元素创建所有可能的列表,同时保留嵌套列表的结构?

嵌套列表:

l = list(
a = list(
b = 1:2
),
c = list(
d = list(
e = 3:4,
f = 5:6
)
),
g = 7
)

期望输出: l 元素的所有可能组合,同时保留结构,例如:

# One possible output:
list(
a = list(
b = 1
),
c = list(
d = list(
e = 3,
f = 5
)
),
g = 7
)

# Another possible output:
list(
a = list(
b = 1
),
c = list(
d = list(
e = 4,
f = 5
)
),
g = 7
)

到目前为止,我的方法是:
  • 展平列表(例如,如 this answer 中所述)
  • expand.grid() 并得到一个矩阵,其中每一行代表一个唯一的组合
  • 解析结果矩阵的每一行并从 names() 重建结构使用正则表达式

  • 我正在寻找一种不那么麻烦的方法,因为我不能保证列表元素的名称不会改变。

    最佳答案

    relist函数来自 utils似乎是为这个任务设计的:

    rl <- as.relistable(l)
    r <- expand.grid(data.frame(rl), KEEP.OUT.ATTRS = F)
    > head(r, 5)
    b c.d.e c.d.f g
    1 1 3 5 7
    2 2 3 5 7
    3 1 4 5 7
    4 2 4 5 7
    5 1 3 6 7

    它保存列表的结构( skeleton )。这意味着现在可以操作嵌套列表中的数据并将其重新分配到结构中 ( flesh )。这里是扩展矩阵的第一行。
    r <- rep(unname(unlist(r[1,])),each = 2)
    l2 <- relist(r, skeleton = rl)
    > l2
    $a
    $a$b
    [1] 1 1


    $c
    $c$d
    $c$d$e
    [1] 3 3

    $c$d$f
    [1] 5 5



    $g
    [1] 7

    attr(,"class")
    [1] "relistable" "list"

    请注意,由于结构保持不变,我需要提供与原始列表中相同数量的元素。这就是为什么使用 rep重复元素两次。也可以填写 NA ,我猜。

    对于每个可能的组合,迭代 r (扩展):
    lapply(1:nrow(r), function(x) 
    relist(rep(unname(unlist(r[x,])),each = 2), skeleton = rl))

    关于r - 如何从嵌套列表创建所有组合,同时使用 R 保留结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448008/

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