4

我有以下情况:

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

第一个问题:哪个是重复的?- 对 vec1 回答“A”和“C”,对 vec2 回答 0

第二个问题:确定哪个是 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

这不是我所期望的......

4

3 回答 3

4

对于第一个问题,尝试?duplicated

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

[1] "A" "C"

对于第二个,尝试?setdiff. 您想要 vec2 的值不在 vec1 中。

setdiff(vec2, vec1)
[1] "F"
于 2012-07-05T01:40:49.583 回答
3

vec1 中重复的元素:

vec1[duplicated(vec1)]

[1] "A" "C"

vec1 中不在 vec2 中的元素:

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

[1] "E"

反之亦然:

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

[1] "F"
于 2012-07-05T01:38:51.383 回答
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

当像“!=”这样的二元运算符在向量上工作时,回收规则会接管,因此两个向量中较长的向量决定了比较的“范围”,而较短的向量通过回收得到扩展。你最终测试:

> 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
于 2012-07-05T02:58:03.897 回答