gpt4 book ai didi

R - 按名称将多个 2 级元素附加到列表的每个 1 级元素

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

我有一个名为 master 的列表,其中包含三个 ID:

master = list(p1 = list(id = 'abc'), p2 = list(id = 'def'), p3 = list(id = 'ghi'))
str(master)
List of 3
$ p1:List of 1
..$ id: chr "abc"
$ p2:List of 1
..$ id: chr "def"
$ p3:List of 1
..$ id: chr "ghi"

对于此列表的每个级别 1 元素,我想附加来自 val 的相应值和半径元素。和 rad列出:
val = list(p1 = list(value = 5), p3 = list(value = 8))
str(val)
List of 2
$ p1:List of 1
..$ value: num 5
$ p3:List of 1
..$ value: num 8

rad = list(p1 = list(radius = 2), p2 = list(radius = 10))
str(rad)
List of 2
$ p1:List of 1
..$ radius: num 2
$ p2:List of 1
..$ radius: num 10

我必须小心地按名称匹配元素,因为 valradmaster 的结构不同,即 val缺少 p2 的插槽和 rad缺少 p3 的插槽.

我可以使用以下内容来部分达到预期的结果:
master_final = lapply(X=names(master),function(x, master, val, rad) c(master[[x]], val[[x]], rad[[x]]), master, val, rad)
str(master_final)
List of 3
$ :List of 3
..$ id : chr "abc"
..$ value : num 5
..$ radius: num 2
$ :List of 2
..$ id : chr "def"
..$ radius: num 10
$ :List of 2
..$ id : chr "ghi"
..$ value: num 8

但我希望结果列表的每个元素都具有相同的结构,即 id , valueradius投币口。我不确定如何以推广到任意数量列表的方式执行此操作?我不想写 [[x]]对于 lapply 中的每个列表功能: function(x, master, val, rad) c(master[[x]], val[[x]], rad[[x]]) .

最佳答案

一种方法是将列表转换为数据框并执行 merge基于列表名称。然后我们可以split基于 list_name 的数据框.

df1 <- Reduce(function(x, y) merge(x, y, all = TRUE, by = "ind"), 
list(stack(master), stack(val),stack(rad)))

names(df1) <- c("list_name", "id", "value", "radius")
lapply(split(df1[-1], df1$list_name), as.list)


#$p1
#$p1$id
#[1] "abc"
#$p1$value
#[1] 5
#$p1$radius
#[1] 2


#$p2
#$p2$id
#[1] "def"
#$p2$value
#[1] NA
#$p2$radius
#[1] 10


#$p3
#$p3$id
#[1] "ghi"
#$p3$value
#[1] 8
#$p3$radius
#[1] NA

这保持 NA列表中的值,如果我们想删除它们,代码会变得有点难看。
lapply(split(df1[-1], df1$list_name), function(x) 
{inds <- !is.na(x); as.list(setNames(x[inds], names(x)[inds]))})

关于R - 按名称将多个 2 级元素附加到列表的每个 1 级元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57822645/

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