gpt4 book ai didi

R - 根据匹配的名称逐个元素组合任意列表

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

我有两个列表

m = list( 'a' = list( 'b' = list( 1, 2 ), 'c' = 3, 'b1' = 4, 'e' = 5 ) )

n = list( 'a' = list( 'b' = list( 10, 20 ), 'c' = 30, 'b1' = 40 ), 'f' = 50 )

其中m的结构是:

List of 1
$ a:List of 4
..$ b :List of 2
.. ..$ : num 1
.. ..$ : num 2
..$ c : num 3
..$ b1: num 4
..$ e : num 5

n的结构是:

List of 2
$ a:List of 3
..$ b :List of 2
.. ..$ : num 10
.. ..$ : num 20
..$ c : num 30
..$ b1: num 40
$ f: num 50

想要这样的组合输出。此外,该解决方案对于深层嵌套列表应该是通用的。

预期输出:

List of 2


$ a:List of 4
..$ b :List of 4
.. ..$ : num 1
.. ..$ : num 2
.. ..$ : num 10
.. ..$ : num 20
..$ c : num [1:2] 3 30
..$ b1: num [1:2] 4 40
..$ e : num 5
$ f: num 50

看过这个,但是对深度嵌套的列表不够通用

R: Combining Nested List Elements by Name

最佳答案

这是一个递归的方法:

mergeList <- function(x, y){
if(is.list(x) && is.list(y) && !is.null(names(x)) && !is.null(names(y))){
ecom <- intersect(names(x), names(y))
enew <- setdiff(names(y), names(x))
res <- x
if(length(enew) > 0){
res <- c(res, y[enew])
}
if(length(ecom) > 0){
for(i in ecom){
res[i] <- list(mergeList(x[[i]], y[[i]]))
}
}
return(res)
}else{
return(c(x, y))
}
}

m = list( 'a' = list( 'b' = list( 1, 2 ), 'c' = 3, 'b1' = 4, 'e' = 5 ) )
n = list( 'a' = list( 'b' = list( 10, 20 ), 'c' = 30, 'b1' = 40 ), 'f' = 50 )
mn <- mergeList(m, n)

str(mn)
# List of 2
# $ a:List of 4
# ..$ b :List of 4
# .. ..$ : num 1
# .. ..$ : num 2
# .. ..$ : num 10
# .. ..$ : num 20
# ..$ c : num [1:2] 3 30
# ..$ b1: num [1:2] 4 40
# ..$ e : num 5
# $ f: num 50

如果您有多个嵌套列表(例如,m1m2m3)要合并,Reduce 可能会有帮助:

Reduce(mergeList, list(m1, m2, m3))

关于R - 根据匹配的名称逐个元素组合任意列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51263678/

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