之間差我有兩個載體:取兩個向量
a<-1:100
b<-sample(1:100,80)
我想顯示的那些不包括在B的那些元素。
我試過subset(a,a!==b)
和a[a!==b]
但這些都不起作用。我究竟做錯了什麼?
之間差我有兩個載體:取兩個向量
a<-1:100
b<-sample(1:100,80)
我想顯示的那些不包括在B的那些元素。
我試過subset(a,a!==b)
和a[a!==b]
但這些都不起作用。我究竟做錯了什麼?
由於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行話,%in%
是用於標識共同的元件,然後否定與!
很常見的,但我發現setdiff
爲(至少多語言)的邏輯。
'setdiff'和'%in%'如何比較速度? –
@Manetheran,真的嗎?如果你是從純量化的角度講話的,而且你非常擅長檢測微秒的差異,那麼我會猜測*(純粹通過查看'setdiff'和'%in%'的代碼)'setdiff'會慢一點,因爲它包含使用'as.vector'轉換輸入,並且它包含'if ... else'條件。 – A5C1D2H2I1M1N2O1R2T1
@Manetheran,還要注意''setdiff'和'%in%'是不一樣的。再看一下代碼,你會發現'setdiff'返回'unique'結果(這又可能會使得它比'%in%'慢)。 – A5C1D2H2I1M1N2O1R2T1
一個有用的命令是%in%
。對於向量a的每個元素,這將返回TRUE或FALSE,無論該元素是否在向量b中。然後您可以使用!
否定這一點。因此:
a[!(a %in% b)]
'=='用於邏輯比較,'!='用於否定......注意第二個單獨的'='。 – Justin
字符串「沒有工作」不是R中的內置錯誤消息。 – 2013-08-27 14:10:40
請參閱'setdiff'。 – A5C1D2H2I1M1N2O1R2T1