1. ホーム
  2. r

[解決済み] dplyr の文字列列で複数の値をフィルタリングする

2023-03-12 02:09:12

質問

私は data.frame があり、その中の1つのカラムに文字データが入っています。 の中にある複数の選択肢をフィルタリングしたい。 data.frame の複数のオプションを同じ列からフィルタリングしたいのです。私が見逃しているこれを行うための簡単な方法はありますか?

例です。 data.frame 名前 = dat

days      name
88        Lynn
11          Tom
2           Chris
5           Lisa
22        Kyla
1          Tom
222      Lynn
2         Lynn

をフィルタリングしたい TomLynn を例にとります。

するとき。

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 に等しい全ての奇数値、または "Tom"に等しい全ての偶数値について

サンプル データ フレームの最後の値は偶数で "Lynn"に等しいので、1 つの TRUE となります。

対比するために dat$name %in% target は言う。

の各値に対して dat$name に存在することを確認します。 target .

非常に異なっています。 以下はその結果です。

[1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

あなたの問題は dplyr とは関係なく、単に == .