2016-09-15 61 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