代码之家  ›  专栏  ›  技术社区  ›  Comfort Eagle

R:如何使用relist()重建列表?

  •  0
  • Comfort Eagle  · 技术社区  · 6 年前

    看了之后 this answer ,我有信心 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_ 我是说, 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在评论中提到的, 重新列表() 更改列表后需要相同的结构。所以我重新表述我的问题: 如何根据另一个列表的结构从向量创建列表? 我更喜欢一个同样适用于嵌套列表的解决方案。

    0 回复  |  直到 6 年前
        1
  •  2
  •   d.b    6 年前
    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"
    

    于2019-09-02由 reprex package (第0.3.0版)

        2
  •  0
  •   Ronak Shah    6 年前

    如果你想在 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"