多个向量之间共享元素的交叉制表
Cross-tabulation of shared elements between several vectors
我正在尝试在 R 中同时获取多个向量之间的交集中的元素数量,但失败了:我有几个不同长度的字符向量(唯一元素),并且想要获取它们之间共享的元素数量每对向量。
本质上,这意味着类似于 length(intersect(a,b))
,但重复了几个 times/as 对所有向量组合的交叉制表。
我觉得这是一个涉及 apply()
家族之类的简单案例,但我似乎无法弄清楚...:-/
感谢您的宝贵意见!
可以使用Reduce
;这是一个最小的可重现示例
a1 <- 1:5
a2 <- 3:6
a3 <- 4:9
Reduce(intersect, list(a1, a2, a3))
#[1] 4 5
关键是将向量存储在 list
.
中
要获得所有向量组合的交集,您可以执行以下操作:
l <- list(a1 = 1:5, a2 = 3:6, a3 = 4:9)
intsct_list <- combn(seq_along(l), 2, function(x) intersect(l[[x[1]]], l[[x[2]]]), simplify = FALSE)
names(intsct_list) <- combn(names(l), 2, paste0, collapse = "")
lengths(intsct_list)
a1a2 a1a3 a2a3
3 2 3
我正在尝试在 R 中同时获取多个向量之间的交集中的元素数量,但失败了:我有几个不同长度的字符向量(唯一元素),并且想要获取它们之间共享的元素数量每对向量。
本质上,这意味着类似于 length(intersect(a,b))
,但重复了几个 times/as 对所有向量组合的交叉制表。
我觉得这是一个涉及 apply()
家族之类的简单案例,但我似乎无法弄清楚...:-/
感谢您的宝贵意见!
可以使用Reduce
;这是一个最小的可重现示例
a1 <- 1:5
a2 <- 3:6
a3 <- 4:9
Reduce(intersect, list(a1, a2, a3))
#[1] 4 5
关键是将向量存储在 list
.
要获得所有向量组合的交集,您可以执行以下操作:
l <- list(a1 = 1:5, a2 = 3:6, a3 = 4:9)
intsct_list <- combn(seq_along(l), 2, function(x) intersect(l[[x[1]]], l[[x[2]]]), simplify = FALSE)
names(intsct_list) <- combn(names(l), 2, paste0, collapse = "")
lengths(intsct_list)
a1a2 a1a3 a2a3
3 2 3