2017-06-13 5 views
1

私は、行ごとに2つの列に等しいかどうかをテストしようとしています。しかし、私のデータは数字ではありません。私が扱っているデータセットは、2つのデータセットからマージされました。データを調べると、同じでなければならない列が実際に異なっていることが気付きました。これは非常に大きなデータセット(約300K obs)なので、私はコードを作成しようとしています。2つの列(因子/文字データ)の等しいかどうかの行ごとのテスト

など。 Source.xはマージ関数の最初のデータセットからのもので、Source.yはマージ関数の2番目のデータセットからのものです。

RightID Source.x Source.y 
1000  Ground  Unnamed Stream 
1001  Ground  Ground 
1002  Stream  Stream 
1003  Bear Creek Ground 

これ以降、観測値1000と1003を含む新しいデータフレームを返したいと思います。データは、因子/文字形式で、ソース名の変動に起因するさまざまなレベルを持っているので、私は、次のコードを試してみました...

lapply(rights, rights$Source.x == rights$Source.y 
filter(rights, rights$Source.x == rights$Source.y 
filter(rights, identical(Source.x, Source.y) 

はしかし、私のコードのどれも動作するように管理していません。 Source.xには6743のレベルがあり、Source.yには6457があります。私の知る限りでは、このレベルの問題について詳述している私の問題に対する投稿された解決策はありません。誰かが何か提案があれば、それは非常に高く評価されるだろう。

+0

データを読むときにオプション 'stringsAsFactors = F'を使うこともできますし、' dplyr'を使うと文字列を文字列として保持する 'data_frame'を使うこともできます。 – rconradin

答えて

0

levels <- sort(unique(unlist(rights[, c('source.x', 'source.y')]))) rights$source.x <- factor(rights$source.x, levels = levels) rights$source.y <- factor(rights$source.y, levels = levels) result <- rights[rights$source.x == rights$source.y, ]

彼らは一貫しているように、あなたは、要因のそれぞれのレベルを指定することができます。両方の列を使用してレベルの一意のリストを作成するだけです。

+0

こんにちは@troh、あなたの入力に感謝します。コードは正常に実行されましたが、結果は286 K行の空のデータフレームを生成しました(権利データベースの行数に相当)。何か案は? – DPek

+0

私は自分の答えを更新しました。 '=='おそらく 'same'の代わりに使いたいものです – troh

関連する問題