R 多元素向量的公共元素

R 多元素向量的公共元素,r,vector,intersection,R,Vector,Intersection,如何有效地找到具有重复元素的两个向量的公共元素 例如: v1 <- c(1, 1, 2, 3, 3, 4) v2 <- c(1, 1, 1, 3, 4, 5) commonElements <- c(1, 1, 3, 4) v1我确信有很多方法可以做到这一点,但我选择了对其进行排序,并使用rle获取值和计数表格也可能完成同样的任务 common <- function(v1, v2){ r1 <- rle(sort(v1)) r2 <- rl

如何有效地找到具有重复元素的两个向量的公共元素

例如:

v1 <- c(1, 1, 2, 3, 3, 4)  
v2 <- c(1, 1, 1, 3, 4, 5)  
commonElements <- c(1, 1, 3, 4)

v1我确信有很多方法可以做到这一点,但我选择了对其进行排序,并使用
rle
获取值和计数<代码>表格
也可能完成同样的任务

common <- function(v1, v2){
  r1 <- rle(sort(v1))
  r2 <- rle(sort(v2))
  vals <- intersect(r1$values, r2$values)
  l1 <- r1$lengths[r1$values %in% vals]
  l2 <- r2$lengths[r2$values %in% vals]
  rep(vals, pmin(l1, l2))
}

common(v1, v2)

这是另一个选择:

common <- function(v1, v2) {
  lvls <- unique(c(v1, v2))
  v1a <- factor(v1, levels=lvls)
  v2a <- factor(v2, levels=lvls)
  v <- pmin(table(v1a), table(v2a))
  as.numeric(rep(names(v), v))
}

common(rep(1:3, 1:3), rep(1:2, 1:2))
[1] 1 2 2

common(rep(c(1,3,5), 1:3), rep(c(5,2), 2))
[1] 5 5

common我喜欢
intersect
table
s,所以

tv1 <- table(v1)
tv2 <- table(v2)
comvals <- intersect(names(tv1),names(tv2))
comtab <- apply(rbind(tv1[comvals],tv2[comvals]),2,min)

编辑:如果你真的想要那个向量,那么它是:
as.numeric(rep(names(comtab),comtab))

两个向量的长度相等吗?不,不能假设。它们也没有被分类。它可以工作,但我需要大量使用这个函数,我有点担心效率。您的解决方案使用:2*rle、2*sort、2*%in%和1*交集。我希望有一个聪明的方法来解决这个问题。你在这个问题上从来没有提到效率,所以我把这个作为第一次尝试。但是,同样没有保证向量长度相等,或者如果向量被排序,或者关于向量本身的任何其他知识。。。如果你想加速,你可以使用Rcpp。。。尽管如此,这个解决方案对我来说似乎相当快,即使是大向量。我在问题的一开始提到了效率:“如何高效……”。我将测试您的解决方案的效率。谢谢@罗兰,你确定吗?对我来说,似乎在处理不同长度的向量。它不会被分类,但对我有效。除非我没有尝试足够的测试用例…啊,这就是创建因子的目的+因此,只需计算
unique(v1,v2)
一次而不是两次,就可以获得基本的速度提升
tv1 <- table(v1)
tv2 <- table(v2)
comvals <- intersect(names(tv1),names(tv2))
comtab <- apply(rbind(tv1[comvals],tv2[comvals]),2,min)
> comtab
1 3 4 
2 1 1