【问题标题】:R how to find the intersection of a subest of vectors in a listR如何在列表中找到向量子集的交集
【发布时间】:2017-01-23 17:16:40
【问题描述】:

我有一个向量(字符)列表。例如:

my_list <- list(c("a", "b", "c"), 
                c("a", "b", "c", "d"), 
                c("e", "d"))

对于所有这三个向量的交集,我可以使用:Reduce(intersect, my_list)。但是正如你所看到的,这三个向量中没有共同的元素。

那么,如果我想找到在列表中“至少”出现一定次数的共同元素呢?如:somefunction(my_list, time=2) 会给我c("a", "b", "c", "d"),因为这些元素出现了两次。

谢谢。

【问题讨论】:

    标签: r list vector intersection


    【解决方案1】:

    我们可以将其转换为data.table 并按操作分组以获取元素

    library(data.table)
    setDT(stack(setNames(my_list, seq_along(my_list))))[,
               if(uniqueN(ind)==2) values , values]$values
    #[1] "a" "b" "c" "d"
    

    base R 选项将是 unlist 'my_list',使用 table 找到具有 'my_list' 复制序列的频率计数,获取列总和,检查它是否等于 2 并使用该索引子集names

    tblCount <- colSums(table(rep(seq_along(my_list), lengths(my_list)), unlist(my_list)))
    names(tblCount)[tblCount==2]
    #[1] "a" "b" "c" "d"
    

    【讨论】:

      【解决方案2】:

      如果您假设每个元素在向量中出现的次数不超过一次,您可以“取消列出”您的向量并计算频率。

      在这里,使用dplyr 函数

      library(dplyr)
      my_list %>% unlist %>% data_frame(v=.) %>% count(v) %>% filter(n>=2) %>% .[["v"]]
      

      或基函数

      subset(as.data.frame(table(unlist(my_list))), Freq>=2)$Var1
      

      【讨论】:

        【解决方案3】:

        这行得通:

        my_list %>%
          purrr::map(~ .) %>%
          purrr::reduce(.f = dplyr::intersect, .x = .)
        

        【讨论】:

          猜你喜欢
          • 2020-04-27
          • 2015-02-15
          • 2011-04-11
          • 2021-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多