如何使用intersect()在R中保留重复元素?

时间:2014-06-11 12:51:40

标签: r

我有两个向量,称为ab,但向量a中的一些元素会重复出现。 我想计算ab的交点,但在结果中,我还希望重复与ab <交叉的元素/ p>

示例和预期输出在这里:

> a<-c("a","a", "c")
> b<-c("a", "c")

我使用intersect()

获得的内容
> intersect(a,b)
[1] "a" "c"

我期望获得:

>[1] "a"  "a"   "c"

有人会帮我在R?中实现这个吗?

4 个答案:

答案 0 :(得分:2)

这将成为这项工作。 rep的第一个参数是排序的交集,第二个参数是根据ab中元素的平行最大值和b中元素的计数来计算的。 }也在a

   rep(sort(intersect(a, b)), pmax(table(a[a %in% b]), table(b[b %in% a])))
   # [1] "a" "a" "c" "c"

答案 1 :(得分:2)

是的,免费提供我作为套餐作者:使用vecsets套餐。

现在的推理:标准intersectunion等函数在代数规则下运行,代数集包含可区分的元素,即没有&#34;重复。&#34 ;但是为了计算目的和像我一样的怪人,我写了一些版本,允许你假装每个实例,比如&#34; a&#34; ,是独一无二的。

答案 2 :(得分:2)

将其改为丑陋的解决方案

unlist(lapply(intersect(a, b), function(x) rep(x, max(length(a[a %in% x]), length(b[b %in% x])))))

答案 3 :(得分:2)

您的问题描述不是很清楚。也许这个:

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

i <- intersect(a, b)
r <- apply(rbind(table(a)[i], 
                 table(b)[i]),
           2, max)
rep(names(r), r)
#[1] "a" "a" "c" "d" "d"