2012-07-05 89 views
4

我有以下情況:在向量尋找元素重複或不在另一個向量

vec1 <- c("A", "B", "D", "C", "E", "A", "C") 
vec2 <- c("A", "B", "C", "D", "F") 

第一個問題:哪一個是重複的? - 解答 「A」 和 「C」 爲VEC1,0爲VEC2

第二個問題:確定其是VEC1但不是在VEC2,不論順序(回答 「E」)

,或者反之亦然(回答「 F「)

which(vec1 !=vec2) 
which(vec2 !=vec1) 

[1] 3 4 5 7 
Warning message: 
In vec1 != vec2 : 
    longer object length is not a multiple of shorter object length 

這不是我所期待....

+1

@ttmacer,'setdiff'下面提示等價於'unique(which(!vec2%in%vec1))',這在這裏更合適。 – flodel

+0

如果您已經閱讀過R的文檔,包括按元素比較向量的位以及'which'函數的描述,那麼它將完全符合您的預期。 – Spacedman

回答

3

元素VEC 1是重複的:

vec1[duplicated(vec1)] 

[1] "A" "C" 
在VEC 1 10個

元素不在VEC 2:

vec1[is.na(match(vec1,vec2))] 

[1] "E" 

反之亦然:

vec2[is.na(match(vec1,vec2))] 

[1] "F" 
4

對於第一個問題,嘗試?duplicated

vec1.dup <- duplicated(vec1) 
unique(vec1[vec1.dup]) 

[1] "A" "C" 

對於第二,嘗試?setdiff。你想要vec2的值不在vec1中。

setdiff(vec2, vec1) 
[1] "F" 
3

看來你的(第二個)問題是......爲什麼? (我不知道你已經得到了很好的答案正確...如何?)

which(vec1 !=vec2) 
which(vec2 !=vec1) 

兩個返回

[1] 3 4 5 7 

答案就在於你不包括警告信息主要部分:

Warning message: 
In vec1 != vec2 : 
    longer object length is not a multiple of shorter object length 

當二進運營商如「!=」上工作的載體,回收規則接管所以這兩個矢量的長確定用於比較的「範圍」,而較短的一個得到由RECYCL擴展ING。您最終測試:

> c("A", "B", "C", "D", "F", "A", "B") != c("A", "B", "D", "C", "E", "A", "C") 
             #.... extending shorter one ^^^^^^^ 
[1] FALSE FALSE TRUE TRUE TRUE FALSE TRUE 
> c("A", "B", "D", "C", "E","A", "C") != c("A", "B", "C", "D", "F", "A", "B") 
#.... extending shorter one ^^^^^^^ 
[1] FALSE FALSE TRUE TRUE TRUE FALSE TRUE 
相關問題