2013-08-27 48 views
0

之間差我有兩個載體:取兩個向量

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

我想顯示的那些不包括在B的那些元素。

我試過subset(a,a!==b)a[a!==b]但這些都不起作用。我究竟做錯了什麼?

+1

'=='用於邏輯比較,'!='用於否定......注意第二個單獨的'='。 – Justin

+3

字符串「沒有工作」不是R中的內置錯誤消息。 – 2013-08-27 14:10:40

+4

請參閱'setdiff'。 – A5C1D2H2I1M1N2O1R2T1

回答

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行話,%in%是用於標識共同的元件,然後否定與!很常見的,但我發現setdiff爲(至少多語言)的邏輯。

+0

'setdiff'和'%in%'如何比較速度? –

+0

@Manetheran,真的嗎?如果你是從純量化的角度講話的,而且你非常擅長檢測微秒的差異,那麼我會猜測*(純粹通過查看'setdiff'和'%in%'的代碼)'setdiff'會慢一點,因爲它包含使用'as.vector'轉換輸入,並且它包含'if ... else'條件。 – A5C1D2H2I1M1N2O1R2T1

+1

@Manetheran,還要注意''setdiff'和'%in%'是不一樣的。再看一下代碼,你會發現'setdiff'返回'unique'結果(這又可能會使得它比'%in%'慢)。 – A5C1D2H2I1M1N2O1R2T1

1

一個有用的命令是%in%。對於向量a的每個元素,這將返回TRUE或FALSE,無論該元素是否在向量b中。然後您可以使用!否定這一點。因此:

a[!(a %in% b)]