2016-09-12 2 views
0

%c()と%c()の%を使用して複数の条件でデータをフィルタリングすると予期しない動作が発生しています。 == c()メソッドを使用すると不完全な結果が返されます。この動作の論理的な説明はありますか?%in subsettingの場合

df <- data.frame(region = as.factor(c(1,1,1,2,2,3,3,4,4,4)), 
      value = 1:10) 

library(dplyr) 
filter(df, region == c(1,2)) 
filter(df, region %in% c(1,2)) 

# using base syntax 
df[df$region == c(1,2),] 
df[df$region %in% c(1,2),] 

「地域」を数値に変換しても結果は変わりません。

+1

'c(1,1,1,2,2,3,3,4,4,4)== 1:2'は' c(1,1,1,2,2,3,3、 4,4,4)== c(1,2,1,2,1,2,1,2,1,2) '、あるいはあなたはどういう意味ですか? – lukeA

+1

'region == 1 |として書く必要があります。領域== 2 'である。上記のコメントはRの(ときどき迷惑な)ベクトルリサイクルルールを指します。 – Vlo

+1

data.tableを使うと 'df [region == c(1,2)]'のエラーを返すことが期待されていると思います。 – moman822

答えて

4

== c()メソッドを使用すると、不完全な結果が返されます。この現象についての論理的な説明は ですか?一種の論理だ

、見てみましょう:

df$region == 1:2 
# [1] TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE 
df$region %in% 1:2 
# [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE 

@lukeAは、このフォームは同じである彼のコメントで述べたような理由は、あなたが別な長さのベクトルを比較しようとする最初の形式です( )implementation-of-standard-recycling-rules参照:演算子の左側の各値は、操作者の右手側に対応する値を用いて試験され

# 1 1 1 2 2 3 3 4 4 4 ## df$region 
# 1 2 1 2 1 2 1 2 1 2 ## c(1,2) recycled to the same length 
# T F T T F F F F F F ## equality of the corresponding elements 

df$region == c(1,2,1,2,1,2,1,2,1,2) 
# [1] TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE 

。あなたがdf$region %in% 1:2を使用する場合

は、しかし、それはアイデアでより多くのです:

sapply(df$region, function(x) { any(x==1:2) }) 
# [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE 

私が意味する各値は、第二のベクターに対してテストされ、1つの一致があるかどうTRUEが返されます。

+1

私の意見では、Rイントロの5.4.1が最良のリファレンスです(ここのドキュメントからリンクされています:http://stackoverflow.com/documentation/r/5649/recycling#t=201609121720574317665&a=remarks) – Frank

関連する問題