区分两个向量

时间:2013-08-27 14:09:10

标签: r

我有两个向量:

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

我想显示b中未包含的那些元素。

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

2 个答案:

答案 0 :(得分:3)

由于R中的矢量化,使用==对您的示例不起作用。您应该使用的是setdiffis.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)]