53

データフレーム dih_y2 があります。次の 2 行で警告が表示されます。

> memb = dih_y2$MemberID[1:10]
> dih_col = which(dih_y2$MemberID == memb)  
Warning message:
In dih_y2$MemberID == memb :
longer object length is not a multiple of shorter object length

なんで?

4

4 に答える 4

91

再現可能な例は示していませんが、警告メッセージは問題が何であるかを正確に示しています。

membの長さは 10 だけです. の長さは 10dih_y2$MemberIDの倍数ではないと推測==しています.することを期待しています。==等しいかどうかを要素ごとにチェックします。あなたがやりたいことはdih_y2$MemberID、 vector にもある の要素を見つけることだと思いますmemb。これを行うには、%in%演算子を使用します。

dih_col <- which(dih_y2$MemeberID %in% memb)
于 2012-06-02T19:13:53.047 に答える
32

R で 2 つのベクトル間でブール比較を実行する場合、R が対応する各要素を順番に比較できるように、両方のベクトルが同じ長さであることが "期待" されます。

R には、リサイクルと呼ばれる非常に愛されている (または嫌われている) 機能があります。これにより、多くの状況で、R が通常同じ長さのオブジェクトを期待するようなことをしようとすると、短いオブジェクトが自動的に拡張またはリサイクルされ、両方が強制されます。オブジェクトは同じ長さになります。

長いオブジェクトが短いオブジェクトの倍数である場合、これは単純に短いオブジェクトを数回繰り返すことになります。多くの場合、R プログラマーはこれを利用して、よりコンパクトに、より少ないタイピングで処理を行います。

しかし、それらが倍数でない場合、R は間違いを犯したのではないかと心配し、おそらくその比較を実行するつもりはなかったので、警告が表示されます。

次のコードで自分自身を調べてください。

> x <- 1:3
> y <- c(1,2,4)
> x == y
[1]  TRUE  TRUE FALSE
> y1 <- c(y,y)
> x == y1
[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE
> y2 <- c(y,2)
> x == y2
[1]  TRUE  TRUE FALSE FALSE
Warning message:
In x == y2 :
  longer object length is not a multiple of shorter object length
于 2012-06-02T19:15:12.850 に答える