0

我有两个向量:

a<-1:100
b<-sample(1:100,80)

我想显示那些不包含在 b 中的 a 元素。

我已经尝试过subset(a,a!==b)a[a!==b]但这些都不起作用。我究竟做错了什么?

4

2 回答 2

3

由于 R 中的矢量化,因此 using==对您的示例不起作用。您应该使用的是setdiffor is.element(后者等同于%in%)。

set.seed(1)
a<-1:100
b<-sample(1:100,80)
a[!is.element(a, b)]
#  [1]   8  15  33  48  52  54  56  66  68  72  74  80  90  91  92  93  94  96  98 100
setdiff(a, b)
#  [1]   8  15  33  48  52  54  56  66  68  72  74  80  90  91  92  93  94  96  98 100

如果您查看==比较两个向量时的工作原理,它会一次比较这一对,并在必要时回收较短的向量。在 的第一个示例中x == y,它似乎可以正常工作,但请看第二个示例,x == z。这基本上是检查是否x[1] == z[1]x[2] == z[2],等等,所以立即,集合有错位。

x <- 1:10
y <- 1:5
z <- c(1, 3, 5, 7, 9)
x == y 
#  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
x == z
#  [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x %in% z
#  [1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE

在 R 术语中,%in%识别共同元素非常常见,然后用 否定它!,但我发现setdiff(至少在语言上)是合乎逻辑的。

于 2013-08-27T15:23:48.183 回答
1

一个有用的命令是%in%. 对于向量 a 的每个元素,无论该元素是否在向量 b 中,这将返回 TRUE 或 FALSE。然后,您可以使用!. 所以:

a[!(a %in% b)]
于 2013-08-27T14:23:46.310 回答