私が持っているdata.frame
列のいずれかで文字データで。data.frame
同じ列の複数のオプションをフィルタリングしたいと思います。これを行う簡単な方法はありますか?
例: data.frame
名前=dat
days name
88 Lynn
11 Tom
2 Chris
5 Lisa
22 Kyla
1 Tom
222 Lynn
2 Lynn
私はフィルタリングしたいTom
とLynn
例えば。
私がする時:
target <- c("Tom", "Lynn")
filt <- filter(dat, name == target)
私はこのエラーを受け取ります:
longer object length is not a multiple of shorter object length
あなたの%in%
代わりに必要です==
:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target)
生産する
days name
1 88 Lynn
2 11 Tom
3 1 Tom
4 222 Lynn
5 2 Lynn
理由を理解するために、ここで何が起こるかを考えてください:
dat$name == target
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
基本的に、2つの長さのtarget
ベクトルを4回リサイクルして、の長さに合わせdat$name
ます。つまり、次のことを行っています。
Lynn == Tom
Tom == Lynn
Chris == Tom
Lisa == Lynn
... continue repeating Tom and Lynn until end of data frame
この場合、データフレームには実際にはリサイクルが許可されていない異なる行数があるのではないかと思いますが、提供したサンプル(8行)ではエラーが発生していません。サンプルに奇数の行があった場合、私はあなたと同じエラーを受け取るでしょう。しかし、リサイクルが機能する場合でも、これは明らかにあなたが望むものではありません。基本的に、ステートメントdat$name == target
は次のように言うことと同等です。
TRUE
「トム」に等しいすべての奇数値または「リン」に等しいすべての偶数値に対して戻ります。
サンプルデータフレームの最後の値が偶数で「Lynn」に等しいため、TRUE
上記のようになります。
対照的に、dat$name %in% target
言う:
の各値について
dat$name
、に存在することを確認しtarget
ます。
非常に異なります。結果は次のとおりです。
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
問題はとは関係なくdplyr
、の誤用にすぎないことに注意してください==
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加