2016-08-02 9 views
1

私は緯度と経度の座標(Lat、Long)と各エントリの温度測定の深度(Depth)を含むデータフレーム(df)を持っています。本質的に、各エントリは、(x、y、z)=(緯度、長さ、深さ)の各温度測定に関する位置情報を有する。R:特定の値内の重複を見つける

私は、重複した測定場所を見つけて削除することによってデータを消去しようとしています。問題は、いくつかのエントリの緯度/経度の値は、上記のコードではないであろうという意味だけでわずかオフになっていることであるが

df = df[!(duplicated(df$Lat) & duplicated(df$Long) & duplicated(df$Depth)),] 

:簡単な部分は、として扱わ正確重複を除去されそれらをキャッチしますが、それらはまだ明らかに重複しています(例:lat = 39.252880 & lat = 39.252887)。

最初のインスタンスの特定の絶対値またはパーセンテージ内にある重複を見つける方法はありますか?

私は助けていただきありがとうございます!

+4

任意の許容値にすべての値を丸めて、重複を探すことができます。あなたの例では、小数点以下3桁まで四捨五入すると、両方の点で緯度= 39.253になります。あるいは、各測定値の間の空間距離を計算し、互いにある臨界距離内に集まった点のグループを見つけることがより理にかなっています。そして、それらのクラスター内で、同じ深さの行を見つけ、平均化します。空間距離を見つけてポイントのクラスターを特定する方法については、[このSOの答え](http://stackoverflow.com/a/21006437/496488)を参照してください。 – eipi10

+0

最初の方法は、 'df.new = df [!duplicated(round df [、c(" lat "、" long "、" depth ")、3))]]'というコードを短くすることができます。 – eipi10

答えて

0

これに基づいて、postを解決することができました。私は "duplicates"に厳しい許容差を0.001にするように関数を変更しました。そうでない場合、関数は変更されません。ただし、アプリケーションは1行ではなく1列内の値を比較したいので、わずかに変更されます。

output=data.frame(apply(dataDF,2,fun)) 

続行する

、私は、後の使用のための私の出力データフレームに人工的なインデックスを追加する:

output$ind = 1:nrow(output) 

主要部分は、LAT(関数三の位置情報フィールドにTRUE返される行インデックスを見つけることです長い、深い)。次のコードは、3つすべてが真であるインデックスを見つけ、それらのエントリ(まだ論理)を持つ一時データフレームを作成し、重複のインデックスを見つけ出し、それを元に戻して完全な元のデータセットから削除するインデックスを返します(悪い変数名を赦してください):

ind = which(with(output,(Lat=='TRUE' & Long=='TRUE' & Depth=='TRUE'))) 
temp = dataDF[ind,] 
temp$ind = ind 
ind2 = duplicated(temp[,1:3]) 
rem = ind[ind2] 

df.final = dataDF[-rem,] 

うまくいけば助けてください!これはちょっと複雑で、その機能は大規模なデータセットでは遅いですが、は非常に遅いですが、それは仕事を完了します。

関連する問題