基于R中元素名称的子集嵌套列表
Subset nested list based on element name in R
我有 3 个列表,分别称为 T1、T2 和 T3(如下所示)。从这些列表中,我想提取一个子集 Q
.
L1<-list("A"=matrix(c(1:4),2),"B"=matrix(c("a","b","c","d"),2))
L2<-list("P"=matrix(c(5:8),2),"Q"=list(list("u","v","w","x"),2))
T1 <- list(L1, L2)
T2 <- list(NULL, L1, L2)
T3 <- list(L1, NULL, L2)
我需要的输出只是嵌入在父列表(T1、T2 和 T3)中的列表 Q
。
这是我尝试过的解决方案,但它们都是 return Q
-
兄弟姐妹的 NULL 值
lapply(T3, `[[`, "Q")
purrr::map(T3, `[`, "Q")
purrr::map_depth(T3, 2, "Q")
请为父 T1、T2 和 T3 中的 Q
个子集提出解决方案。正如您所看到的,Q 的位置在每个父项中都不同,我正在寻找一种解决方案,通过子名称 Q
对父列表进行子集化,而不是对 Q
.
的位置进行硬编码
没有执行此操作的基本函数。通常,当您 mapping/applying 超过列表时,您希望保留输入的长度。您可以编写一个仅 returns 第一个匹配项
的辅助函数
first_match <- function(x, name) {
for (list in x) {
if (name %in% names(list)) {
return(list[[name]])
}
}
return(NULL)
}
first_match(T1, "Q")
first_match(T2, "Q")
first_match(T3, "Q")
您可以 unlist
父列表 recursive = FALSE
,并得到一个合并列表。然后您可以访问 Q
作为 :
unlist(T1, recursive = FALSE)$Q
unlist(T2, recursive = FALSE)$Q
unlist(T3, recursive = FALSE)$Q
使用外部包,这也可以通过 rrapply
-package 中的 rrapply()
来完成:
library(rrapply)
Q1 <- rrapply(T1, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
Q2 <- rrapply(T2, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
Q3 <- rrapply(T3, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
str(Q1)
#> List of 1
#> $ Q:List of 2
#> ..$ :List of 4
#> .. ..$ : chr "u"
#> .. ..$ : chr "v"
#> .. ..$ : chr "w"
#> .. ..$ : chr "x"
#> ..$ : num 2
我有 3 个列表,分别称为 T1、T2 和 T3(如下所示)。从这些列表中,我想提取一个子集 Q
.
L1<-list("A"=matrix(c(1:4),2),"B"=matrix(c("a","b","c","d"),2))
L2<-list("P"=matrix(c(5:8),2),"Q"=list(list("u","v","w","x"),2))
T1 <- list(L1, L2)
T2 <- list(NULL, L1, L2)
T3 <- list(L1, NULL, L2)
我需要的输出只是嵌入在父列表(T1、T2 和 T3)中的列表 Q
。
这是我尝试过的解决方案,但它们都是 return Q
-
lapply(T3, `[[`, "Q")
purrr::map(T3, `[`, "Q")
purrr::map_depth(T3, 2, "Q")
请为父 T1、T2 和 T3 中的 Q
个子集提出解决方案。正如您所看到的,Q 的位置在每个父项中都不同,我正在寻找一种解决方案,通过子名称 Q
对父列表进行子集化,而不是对 Q
.
没有执行此操作的基本函数。通常,当您 mapping/applying 超过列表时,您希望保留输入的长度。您可以编写一个仅 returns 第一个匹配项
的辅助函数first_match <- function(x, name) {
for (list in x) {
if (name %in% names(list)) {
return(list[[name]])
}
}
return(NULL)
}
first_match(T1, "Q")
first_match(T2, "Q")
first_match(T3, "Q")
您可以 unlist
父列表 recursive = FALSE
,并得到一个合并列表。然后您可以访问 Q
作为 :
unlist(T1, recursive = FALSE)$Q
unlist(T2, recursive = FALSE)$Q
unlist(T3, recursive = FALSE)$Q
使用外部包,这也可以通过 rrapply
-package 中的 rrapply()
来完成:
library(rrapply)
Q1 <- rrapply(T1, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
Q2 <- rrapply(T2, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
Q3 <- rrapply(T3, classes = "list", condition = \(x, .xname) .xname == "Q", how = "flatten")
str(Q1)
#> List of 1
#> $ Q:List of 2
#> ..$ :List of 4
#> .. ..$ : chr "u"
#> .. ..$ : chr "v"
#> .. ..$ : chr "w"
#> .. ..$ : chr "x"
#> ..$ : num 2