0
x1 = c(1,2,3,4,5,6,7)
x1
[1] 1 2 3 4 5 6 7
x1[which(x1== c(5,6))]
[1] 5 6
Warning message:
In x1 == c(5, 6) :
longer object length is not a multiple of shorter object length

R を終了して RI を再度開くと、次のようになります。

x1 = c(1,2,3,4,5,6,7)   
x1
[1] 1 2 3 4 5 6 7
x1[which(x1== c(5,6))]
[1] 5 6

警告メッセージが消えます。なんで?

4

1 に答える 1

2

ここで注意すべき点がいくつかあります。

まさにその理由から、長いアイテムの長さは短いアイテムの長さの倍数ではないため、そのメッセージが表示されるはずです。これは、自分がしていると思っていることは、おそらく実際にしていることではないことを意味します。そのコードを実行しようとするたびに、このメッセージが表示されるはずです。実行したときになぜメッセージが表示されなかったのかわかりません。

論理値を使用してベクトルにインデックスを付けることができるため、ここでは which を使用する必要はありません。

%in%オペレーターで最も探しているもの。あなたが現在行っているのは要素ごとの等価性の比較であり、短いベクトルは長いベクトルと同じ長さになるまで「リサイクル」されます。例えば:

x1 <- c(1, 2)
x2 <- c(1, 2, 3, 4)
x1 == x2
#[1]  TRUE  TRUE FALSE FALSE

これが行っていることは、x1[1] を x2[1] に対してテストし、次に x1[2] を x2[2] に対してテストすることです。次に、x1 にはそれ以上要素がないため、最初に戻ってリサイクルし、x2 に対して x1[1] をテストします。 [3]、次に x2[4] に対して x1[2]。

代わりに、ベクトル x2 にある x1 の要素を見つけたいだけの場合は、前述のように、%in%演算子がそれを処理します。

x1 %in% x2
#[1] TRUE TRUE

これは、x1[1] が x2 の要素かどうかを尋ねています。x1[2] は x2 の要素ですか? などなど…

于 2012-09-23T02:40:28.763 に答える