R语言 如何按元素名称按元素有效地联接两个列表

c7rzv4ha  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(202)

我想知道是否有一个有效的(没有循环)方法来连接两个列表的元素名称。我检查了here,但这并没有帮助我,以及试图访问名称从sapply()作为从here的答案。
假设我有以下列表:

mylist1 <- list(region1 = 1:3, region2 = 5:7)
> mylist1
$region1
[1] 1 2 3

$region2
[1] 5 6 7

mylist2 <- list(region1 = "#E8C506", region2 = "#F3B508")
$region1
[1] "#E8C506"

$region2
[1] "#F3B508"

如何按元素名称获取连接列表:

mylist3 <- list(region1 = list(1:3, "#E8C506"), region2 = list(5:7, "#F3B508"))
> mylist3
$region1
$region1[[1]]
[1] 1 2 3

$region1[[2]]
[1] "#E8C506"

$region2
$region2[[1]]
[1] 5 6 7

$region2[[2]]
[1] "#F3B508"
jdzmm42g

jdzmm42g1#

严重依赖于从@Ajar和@Flodel到Combine/merge lists by elements names的答案,这Map到list而不是向量(c)来实现您的目的:
使用base

keys <- unique(c(names(mylist1), names(mylist2)))
setNames(mapply(list, mylist1[keys], mylist2[keys], SIMPLIFY = FALSE), keys)

使用purrr

library(purrr)

cat_lists <- function(list1, list2) {  

  keys <- unique(c(names(list1), names(list2)))
  map2(list1[keys], list2[keys], list) |>
    set_names(keys)  

}

reduce(list(mylist1, mylist2), cat_lists)

输出量:

$region1
$region1[[1]]
[1] 1 2 3

$region1[[2]]
[1] "#E8C506"

$region2
$region2[[1]]
[1] 5 6 7

$region2[[2]]
[1] "#F3B508"
nkcskrwz

nkcskrwz2#

如果两个列表中的元素相同,则可以使用purrr::transpose()

library(purrr)

transpose(list(mylist1, mylist2))

$region1
$region1[[1]]
[1] 1 2 3

$region1[[2]]
[1] "#E8C506"

$region2
$region2[[1]]
[1] 5 6 7

$region2[[2]]
[1] "#F3B508"

注意tranpose()使用第一个列表作为模板,并按名称匹配后续列表元素,因此,如果列表中的元素不同,则需要确保所有名称首先出现在第一个列表中,例如:

mylist3 <- list(region1 = 1:3, region2 = 5:7, region3 = 5:7)
mylist4 <- list(region1 = "#E8C506", region2 = "#F3B508", region4 = "#F00008")

l <- list(mylist3, mylist4)
l_names <- unique(unlist(lapply(l, names)))
mylist3[l_names] <- mylist3[l_names]

transpose(list(mylist3, mylist4))

$region1
$region1[[1]]
[1] 1 2 3

$region1[[2]]
[1] "#E8C506"

$region2
$region2[[1]]
[1] 5 6 7

$region2[[2]]
[1] "#F3B508"

$region3
$region3[[1]]
[1] 5 6 7

$region3[[2]]
NULL

$region4
$region4[[1]]
NULL

$region4[[2]]
[1] "#F00008"
zbsbpyhn

zbsbpyhn3#

我希望这能成功。

list12 <- mapply(list, mylist1 , mylist2 , SIMPLIFY=FALSE)

相关问题