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 = .)
我有一个向量(字符)列表。例如:
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 = .)