【问题标题】:Extract more than one element in each vector in a list R在列表 R 中的每个向量中提取多个元素
【发布时间】:2018-09-25 00:24:11
【问题描述】:

我有以下列表,比如说:

> a
[[1]]
 [1] "C" "A" "C" "C" "U" "U" "G" "U" "C" "C" "U" "C" "A" "C" "G" "G" "U" "C"

[[2]]
 [1] "G" "U" "A" "G" "C" "A" "C" "U" "A" "A" "A" "G" "U" "G" "C" "U" "U" "A"

我还有其他数字列表,它们对应于我想从 a 中提取的位置索引,比如 b:

> b
[[1]]
 [1]  3  4  6  7  9 10 11 12

[[2]]
 [1]  1  2  3  4  6  7  8 10

我想提取每个字母,其索引位置对应于列表 b 中的向量,例如,输出将类似于:

> c
[[1]]
[1] "C" "C" "U" "G" "C" "C" "U" "C"

[[2]]
[1] "G" "U" "A" "G" "A" "C" "U" "A"

我知道如何从列表中的每个向量中提取一个元素,例如,我想从列表 a 中提取每个第一个元素(索引 1),所以我将应用下一个代码:

lapply(a, '[[', 1)

但是我怎样才能提取多个值呢?如果在最后一个代码中 a 放 b 而不是“1”,我会得到一个错误...

Error in FUN(X[[i]], ...) : 
  attempt to select more than one element in vectorIndex

我应该使用 for 循环吗?

【问题讨论】:

    标签: r list indexing


    【解决方案1】:

    你可以试试:

    mapply(function(x,y) x[y], a, b)
    

    【讨论】:

    • 或简化为mapply('[', a, b)
    • 哦,非常感谢你神奇的mapply函数。我很接近它......
    【解决方案2】:

    这是一种将数据转换为表格格式的方法:

    a <- list(
        c("C", "A", "C", "C", "U", "U", "G", "U", "C", "C", "U", "C", "A", "C", "G", "G", "U", "C"),
        c("G", "U", "A", "G", "C", "A", "C", "U", "A", "A", "A", "G", "U", "G", "C", "U", "U", "A")
    )
    
    b <- list(
        c(3, 4, 6, 7, 9, 10, 11, 12),
        c(1, 2, 3, 4, 6, 7, 8, 10)
    )
    
    
    library(dplyr)
    
    key <- data_frame(
        grp = rep(seq_along(a), lengths(a)),
        element = unlist(a)
    ) %>%
        group_by(grp) %>%
        mutate(loc = seq_len(n()))
    
    lookup <- data_frame(
        grp = rep(seq_along(b), lengths(b)),
        loc = unlist(b)
    )
    
    lookup %>%
        left_join(key, by = c("grp", "loc"))
    
    
    lookup %>%
        left_join(key, by = c("grp", "loc")) %>%
        {split(.$element, .$grp)}
    
    ## $`1`
    ## [1] "C" "C" "U" "G" "C" "C" "U" "C"
    ## 
    ## $`2`
    ## [1] "G" "U" "A" "G" "A" "C" "U" "A"
    

    【讨论】:

    • 或者在“现代”的 tibblish 中:data_frame(a, b) %&gt;% mutate(v = map2(a, b, extract)) 带有 purrr 和 magrittr。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2013-02-08
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多