1

複数のパラメータを指定して、R のデータ フレームから一連の行を選択したいと考えています。通常、これは OR ステートメントを使用して実行できますが、値は配列に格納されます。私はそれらをそのように照会しています(そして運がありません):

私たちを動かすためのいくつかのデータ:

x = array(c(1,2,3),c(5,5))
y=c(1,2)

現在使用しているコマンドは次のとおりです(列1でフィルタリング):

x[x[,1] == y, ]

上記のコマンドを実行すると、次のエラーが発生します。

Warning message:
In x[, i] == y :
  longer object length is not a multiple of shorter object length

これは理にかなっています。私はそれを回避する方法がわかりません。

私が探しているのは:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    2    1    3
[2,]    2    1    3    2    1
[3,]    1    3    2    1    3
[4,]    2    1    3    2    1

助けてくれてありがとう!

4

2 に答える 2

3

を探してい%in%ます。

> x[x[,1] %in% y, ]

#     [,1] [,2] [,3] [,4] [,5]
# [1,]    1    3    2    1    3
# [2,]    2    1    3    2    1
# [3,]    1    3    2    1    3
# [4,]    2    1    3    2    1

@Ricardoがコメントで言ったように、なぜこれが起こっているのかをよりよく説明するために。に等しいx[,1]y、次のようになります。

x[,1] == y
[1]  TRUE  TRUE FALSE FALSE FALSE

y1,2等しいだけであり、両方が一致するためx[, 1]、TRUE を返します。output の長さは に等しくなければならないのでlength(x[, 1])、残りは「リサイクル」され (x = 3, 1, 2 に対して y = 1, 2, 1)、結果は FALSE になります。しかしx[., ]、行のフェッチに使用すると、最初の 2 つの値だけが TRUE になります。したがって、最初の 2 つだけが選択されます。`%in% を使用すると、次の結果が得られます。

x[,1] %in% y
# [1]  TRUE  TRUE FALSE  TRUE  TRUE

これはあなたが期待するものです。

于 2013-03-06T19:03:49.763 に答える
1

@Arunの答えに追加するには、比較される2つのベクトルのサイズが異なる場合、短い方をリサイクルして同じサイズの2つのベクトルを比較し、ペアワイズR比較を行います。(つまり、各ベクトルの最初の要素を比較し、次に各ベクトルの 2 番目の要素を比較します)。R

たとえば、ベクトル 1 の最初の要素をベクトル 2 のすべての要素と比較するわけではありませ。(そのためには、@Arunが言及したように必要です)%in%

例えば、以下を見てください。最初の 2 つの例では、同等の出力が得られます

> c(0, 1, 2, 0, 1, 2) == c(1, 2)
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE

> c(0, 1, 2, 0, 1, 2) == c(1, 2, 1, 2, 1, 2)
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE

The comparisons being made are:

 #  element#   LHS     RHS   areEqual
 #     1.       0       1      FALSE   <~~ Notice that the '0' from LHS is being compared with the '1' from RHS
 #     2.       1       2      FALSE  
 #     3.       2       1      FALSE
 #     4.       0       2      FALSE
 #     5.       1       1       TRUE
 #     6.       2       2       TRUE

これは別の例で、前の例に対して LHS が「シフト」されています。

> c(1, 2, 0, 1, 2, 0) == c(1, 2)
[1]  TRUE  TRUE FALSE FALSE FALSE FALSE

短いベクトルが長い要素の正確な倍数でない場合に何が起こるかに注意してください。(つまり、2 は 7 に入りません)。
再循環は引き続き発生しますが、短いベクトルの一部が最後の再循環から切り取られます。
Rサイズが異なるとは思わなかった場合に備えて、警告を表示します

> c(1, 2, 3, 4, 1, 2, 0) == c(1, 2)
[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE
Warning message:
In c(1, 2, 3, 4, 1, 2, 0) == c(1, 2) :
  longer object length is not a multiple of shorter object length

長い方のベクトルが RHS にあるか LHS にあるかは問題ではないことに注意してください。リサイクルはまったく同じように機能します

> c(1, 2) == c(1, 2, 0, 1, 2, 0)
[1]  TRUE  TRUE FALSE FALSE FALSE FALSE
于 2013-03-06T20:37:23.737 に答える