我有两个向量:
a<-1:100
b<-sample(1:100,80)
我想显示b中未包含的那些元素。
我尝试了subset(a,a!==b)
和a[a!==b]
,但这些都不起作用。我做错了什么?
答案 0 :(得分:3)
由于R中的矢量化,使用==
对您的示例不起作用。您应该使用的是setdiff
或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 lingo中,%in%
非常常见,用于识别共同元素,然后用!
否定它,但我发现setdiff
(至少在语言上)是合乎逻辑的。
答案 1 :(得分:1)
有用的命令是%in%
。对于向量a的每个元素,这将返回TRUE或FALSE,无论该元素是否在向量b中。然后,您可以使用!
对此进行否定。所以:
a[!(a %in% b)]