2012-07-05 47 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 
相关问题