簡體   English   中英

根據給定的結構/列表從向量創建列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM