[英]Create list from vector based on given structure / list
看完這個答案后 ,我相信relist()
應該可以在以下示例中重建列表:
a <- c("AA01_01", "AA01_03", "AA01_04", "AA01_06", "AA01_08", "AA01_11", "AA01_12", "AA01_13",
"AA01_14", "AA01_16", "AA01_19", "AA01_20", "AA02_03", "AA02_04", "AA02_05", "AA02_06", "AA02_07",
"AA02_08", "AA02_09", "AA02_13", "AA02_17", "AA02_19", "AA02_20", "AA03_05", "AA03_09", "AA03_10",
"AA03_12", "AA03_16", "AA03_20", "AA04_01", "AA04_02", "AA04_03", "AA04_10", "AA04_11", "AA04_14",
"AA04_16"
)
b <- list(
b1 = c("AA01_01", "AA01_02", "AA01_03", "AA01_04", "AA01_05", "AA01_06", "AA01_07", "AA01_08", "AA01_09", "AA01_10",
"AA01_11", "AA01_12", "AA01_13", "AA01_14", "AA01_15", "AA01_16", "AA01_17", "AA01_18", "AA01_19", "AA01_20"),
b2 = c("AA02_01", "AA02_02", "AA02_03", "AA02_04", "AA02_05", "AA02_06", "AA02_07", "AA02_08", "AA02_09", "AA02_10",
"AA02_11", "AA02_12", "AA02_13", "AA02_14", "AA02_15", "AA02_16", "AA02_17", "AA02_18", "AA02_19", "AA02_20"),
b3 = c("AA03_01", "AA03_02", "AA03_03", "AA03_04", "AA03_05", "AA03_06", "AA03_07", "AA03_08", "AA03_09", "AA03_10",
"AA03_11", "AA03_12", "AA03_13", "AA03_14", "AA03_15", "AA03_16", "AA03_17", "AA03_18", "AA03_19", "AA03_20"),
b4 = c("AA04_01", "AA04_02", "AA04_03", "AA04_04", "AA04_05", "AA04_06", "AA04_07", "AA04_08", "AA04_09", "AA04_10",
"AA04_11", "AA04_12", "AA04_13", "AA04_14", "AA04_15", "AA04_16", "AA04_17", "AA04_18", "AA04_19", "AA04_20")
)
newList <- relist(flesh = a, skeleton = b)
根據?relist()
,這應該導致newList$b1
包含所有以AA01_
開頭的AA01_
, newList$b2
應該包含AA02_
,依此類推……但是我得到的是:
$b1
[1] "AA01_01" "AA01_03" "AA01_04" "AA01_06" "AA01_08" "AA01_11" "AA01_12" "AA01_13" "AA01_14" "AA01_16" "AA01_19" "AA01_20" "AA02_03" "AA02_04"
[15] "AA02_05" "AA02_06" "AA02_07" "AA02_08" "AA02_09" "AA02_13"
$b2
[1] "AA02_17" "AA02_19" "AA02_20" "AA03_05" "AA03_09" "AA03_10" "AA03_12" "AA03_16" "AA03_20" "AA04_01" "AA04_02" "AA04_03" "AA04_10" "AA04_11"
[15] "AA04_14" "AA04_16" NA NA NA NA
$b3
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
$b4
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
為什么會發生這種情況,我該如何繼續基於模型列表從向量創建列表?
編輯:正如@OganM在評論中所提到的,列表更改后,relist relist()
需要相同的結構。 所以我改一下我的問題: 如何基於另一個列表的結構從向量創建列表? 我希望有一種適用於嵌套列表的解決方案。
lapply(b, function(x) a[a %in% x])
#$b1
# [1] "AA01_01" "AA01_03" "AA01_04" "AA01_06" "AA01_08" "AA01_11" "AA01_12" "AA01_13"
# [9] "AA01_14" "AA01_16" "AA01_19" "AA01_20"
#$b2
# [1] "AA02_03" "AA02_04" "AA02_05" "AA02_06" "AA02_07" "AA02_08" "AA02_09" "AA02_13"
# [9] "AA02_17" "AA02_19" "AA02_20"
#$b3
#[1] "AA03_05" "AA03_09" "AA03_10" "AA03_12" "AA03_16" "AA03_20"
#$b4
#[1] "AA04_01" "AA04_02" "AA04_03" "AA04_10" "AA04_11" "AA04_14" "AA04_16"
嵌套列表可能需要遞歸
# Recursive function
foo = function(l, vect) {
for (i in seq_along(l)) {
l[[i]] = if (class(l[[i]]) == "list") {
Recall(l[[i]], vect)
} else {
vect[ vect %in% l[[i]] ]
}
}
return(l)
}
#DATA (nested list)
a = c("a", "b", "c", "d", "e", "f")
b = list(b1 = c("a", "b", "g", "h"),
b2 = list(b21 = c("a", "d", "y"),
b22 = "f"))
# Usage
foo(b, a)
#> $b1
#> [1] "a" "b"
#>
#> $b2
#> $b2$b21
#> [1] "a" "d"
#>
#> $b2$b22
#> [1] "f"
由reprex軟件包 (v0.3.0)創建於2019-09-02
如果您試圖在a
中找到b
中存在的元素,則可以使用intersect
lapply(b, intersect, a)
#$b1
# [1] "AA01_01" "AA01_03" "AA01_04" "AA01_06" "AA01_08" "AA01_11" "AA01_12"
# "AA01_13" "AA01_14" "AA01_16" "AA01_19" "AA01_20"
#$b2
# [1] "AA02_03" "AA02_04" "AA02_05" "AA02_06" "AA02_07" "AA02_08" "AA02_09"
# "AA02_13" "AA02_17" "AA02_19" "AA02_20"
#$b3
#[1] "AA03_05" "AA03_09" "AA03_10" "AA03_12" "AA03_16" "AA03_20"
#$b4
#[1] "AA04_01" "AA04_02" "AA04_03" "AA04_10" "AA04_11" "AA04_14" "AA04_16"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.