web-dev-qa-db-ja.com

クラス「factor」のオブジェクトに適用される「anti_join」に適用可能なメソッドがありません

特定の列に基づいて、dataframe2に存在しないdataframe1に存在する行を識別したいと思います。以下のコードを使用して、必要な情報を取得しました。

diffId <- anti_join(dat$ID,datwe$ID)

残念ながら、次のエラーが発生しました。

UseMethod( "anti_join")のエラー:
クラス「factor」のオブジェクトに適用される「anti_join」に適用可能なメソッドがありません

両方のデータフレームで目的の列のクラスを確認したところ、factorであることが判明しました。また、問題が解決する可能性があることを前提として、列を別の変数に分割しようとしましたが、うまくいきませんでした。

fac1 <- datwe$ID
fac2 <- dat$ID
diffId <- anti_join(fac2,fac1)

あなたの考えを共有していただけませんか?

ありがとう

8
Prradep

ほとんどすべてのdplyr関数はtblsで動作します(コンテキストに応じてdata.framedata.table、データベース接続など)ですから、本当に必要なのは次のようなものです。

> dat <- data.frame(ID=c(1, 3, 6, 4), x=runif(4))
> datwe <- data.frame(ID=c(3, 5, 8), y=runif(3))
> anti_join(dat, datwe, by='ID') %>% select(ID)
  ID
1  4
2  6
3  1

順序は明らかに保持されないことに注意してください。

異なるレベルで(上記の例の数値とは異なり)係数を使用する場合、関係するfactorcharacterの間で変換が行われます。

ベクトルを操作する場合は、setdiffを使用できます(basedplyrの両方で使用可能)

> setdiff(dat$ID, datwe$ID)
[1] 1 6 4
3
zero323