我有两个向量:
a<-1:100
b<-sample(1:100,80)
我想显示那些不包含在 b 中的 a 元素。
我已经尝试过subset(a,a!==b)
,a[a!==b]
但这些都不起作用。我究竟做错了什么?
我有两个向量:
a<-1:100
b<-sample(1:100,80)
我想显示那些不包含在 b 中的 a 元素。
我已经尝试过subset(a,a!==b)
,a[a!==b]
但这些都不起作用。我究竟做错了什么?
由于 R 中的矢量化,因此 using==
对您的示例不起作用。您应该使用的是setdiff
or 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
(至少在语言上)是合乎逻辑的。
一个有用的命令是%in%
. 对于向量 a 的每个元素,无论该元素是否在向量 b 中,这将返回 TRUE 或 FALSE。然后,您可以使用!
. 所以:
a[!(a %in% b)]