【问题标题】:Use index vector to select / remove values from a list使用索引向量从列表中选择/删除值
【发布时间】:2017-09-27 13:37:23
【问题描述】:

这是我看到SO QUESTION时想到的一个问题

x <- list(c(1:6,32,24), c(1:4,8,10,12,13,17,24), c(1:5,9:15,17,18,19,20,32))

IND <- !duplicated(unlist(x))

输入

> x
[[1]]
[1]  1  2  3  4  5  6 32 24

[[2]]
 [1]  1  2  3  4  8 10 12 13 17 24

[[3]]
 [1]  1  2  3  4  5  9 10 11 12 13 14 15 17 18 19 20 32
> IND
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
[23] FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE

是否可以使用 IND 访问列表元素所以我得到:

期望的输出

[[1]]
[1]  1  2  3  4  5  6 32 24

[[2]]
[1]  8 10 12 13 17

[[3]]
[1]  9 11 14 15 18 19 20

通常我会访问 x[[1]][1] 等元素...

【问题讨论】:

    标签: r list


    【解决方案1】:

    你可以试试:

    IND2 <-split(IND, rep(1:3, sapply(x, length)))
    Map(function(x, y) x[y], x, IND2)
    [[1]]
    [1]  1  2  3  4  5  6 32 24
    
    [[2]]
    [1]  8 10 12 13 17
    
    [[3]]
    [1]  9 11 14 15 18 19 20
    

    想法是将IND 向量转换回使用相应长度的列表。然后使用 Map 循环遍历每个列表元素以进行子集化。

    或尝试 reshape2 & tidyverse 解决方案:

    library(tidyverse)
    library(reshape2)
    melt(x) %>% 
      filter(!duplicated(value)) %>% 
      with(., split(value, L1))
    

    【讨论】:

    • 您是否使用 Map 而不是 mapply 来确保结果保持在列表中?
    • 不,这只是个人的事情。由于 Map 是一个简单的 mapply 包装器,因此您可以同时使用两者。
    猜你喜欢
    • 2011-02-13
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2011-03-17
    • 2022-07-21
    相关资源
    最近更新 更多