R如何找​​到列表中向量子集的交集

R how to find the intersection of a subest of vectors in a list

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

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

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

那么,如果我想在列表中找到"at least"出现一定次数的公共元素怎么办?如:somefunction(my_list, time=2) 会给我 c("a", "b", "c", "d") 因为那些元素出现了两次。

谢谢。

我们可以将其转换为 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"

A 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"

如果您假设每个元素在向量中出现的次数不会超过一次,则可以 "unlist" 您的向量并计算频率。

此处,使用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

这个有效:

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