2014-06-11 28 views
-4

我有兩個向量,稱爲ab,但重複向量a中的一些元素。 我想計算的ab的相交,但在結果,我也想有一個是在ab如何使用intersect()在R中保留重複元素?

的例子相交元素的重複和預期的輸出在這裏:

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

我與intersect()

> intersect(a,b) 
[1] "a" "c" 

得到我期望得到什麼:

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

有人能幫我在R中實現這個嗎?

+2

你的例子實際上是錯誤的。現在,如果你有'x <-c(1,1,2,3)'和'y <-c(1,1,1,3)',那麼交點就是'1 1 3'。 –

+2

爲什麼在你的回報中只有兩個「a」?你的'a'變量有兩個,'b'有另一個。如果你的函數是對稱的,那麼myintersect(a,b)和myintersect(b,a)是一樣的 - 而且這個順序很重要? – Spacedman

+2

上面的兩條評論很重要,直到你澄清假設對於你的交叉點是什麼,這個問題才能得到明確的回答。 –

回答

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" 
+0

在a和b的交集處不應該有三個「d」嗎?一個來自b和一個來自兩個? – Spacedman

+1

@Spacedman - 看起來應該只是兩個「d」等,看問題的例子。他想要的是讓每個字符的最大出現次數與矢量無關。 –

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" 
2

是的,同聲明我是包作者:使用vecsets包。

現在推理:標準intersectunion等功能按照代數規則進行操作,其規定集合包含可區分的元素,即無「重複」。但爲了計算目的和像我這樣的怪人,我寫了一些版本,可以讓你假裝每個例如「a」都是唯一的。

2

改成了一些醜陋的解決方案

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

在兩種情況下都不會很好,即: 'b <-c(「a」,「c」,「c」)' 'a <-c(「a」,「a」 「c」)' 結果將是''a「」a「」c「'而不是''a」「a」「c」「c」' –

+0

@ webbider,您的示例可以正常使用我的代碼 –

+0

就像@ webspider說的那樣:這種失敗會導致各種重複。我在'vecsets'中編寫了緊湊的代碼之前就試過了。 –

相關問題