2016-09-15 42 views
3

我有一个向量(字符)的列表。例如:R如何在列表中找到向量的一个子集的交集

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"),因为这些元素出现两次。

谢谢。

回答

3

我们可以通过行动将此转换为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”,找到复制的频率计数'my_list'的序列使用table,获取列总和,检查它是否等于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