0

非常に大きなデータセットを扱っていますが、これまでに経験したことのない固有の問題があります。これは GPS ポイントとペアになったレーダー データです。レーダー処理を通じて、データ ポイント間を補間して、地平線を選択するためのレーダー画像を滑らかにしました。エクスポート後、実際のポイントごとに複数のポイントができました (緯度と経度のエントリが繰り返されていることに注意してください)。これはその補間のアーティファクトであり、実際のデータではありません。私がやりたいのは、緯度と経度の一意のペアごとに 1 つのエントリを選択し、それを新しいデータ フレームに貼り付けることです。時間を平均するか、ランダムに選択するかはまだ決めていませんが、一意のペアをペアにしようとして成功していません。私のジレンマは、各列に約 4000 個の一意の値があるため、単純な for ループは私のニーズに合わないようです。私のデータの上部のサンプルを以下に示します。

私はMatlabとRに精通しているので、より単純なソリューションを提供するものは何でも問題ありません。

TL;DR: グループ化された緯度と経度の各ペアを選択し、そのグループの単一のエントリを新しいファイルにエクスポートします

line trace  t_d C       lat       long      elev      time depth amplitude
1    0     5 0.08 0 58.809629 -134.19494 1759.6395 60.399998 4.530 202.90558
2    0     6 0.10 0 58.809629 -134.19494 1759.6395 60.279999 4.521 250.44923
3    0     7 0.12 0 58.809629 -134.19494 1759.6398 60.199997 4.515 202.77191
4    0     8 0.14 0 58.809629 -134.19494 1759.6398 60.199997 4.515 137.59879
5    0     9 0.16 0 58.809629 -134.19494 1759.6398 60.079998 4.506  76.98897
6    0    10 0.18 0 58.809629 -134.19494 1759.6398 59.959999 4.497  71.91417
7     0    11 0.20 0 58.809629 -134.194940 1759.6398 60.399998 4.530  -76.34547
8     0    12 0.22 0 58.809629 -134.194939 1759.6401 60.520000 4.539  -71.92880
9     0    13 0.24 0 58.809629 -134.194939 1759.6401 60.639999 4.548  -95.66286
10    0    14 0.26 0 58.809629 -134.194939 1759.6401 60.759998 4.557 -161.85239
11    0    15 0.28 0 58.809629 -134.194939 1759.6401 60.879997 4.566 -256.24988
12    0    16 0.30 0 58.809629 -134.194939 1759.6401 61.000000 4.575 -374.82968
13    0    17 0.32 0 58.809629 -134.194939 1759.6404 61.000000 4.575 -322.71951
14    0    18 0.34 0 58.809629 -134.194939 1759.6404 61.000000 4.575 -270.60934
15    0    19 0.36 0 58.809629 -134.194939 1759.6404 60.879997 4.566 -251.24893
4

2 に答える 2

1

MATLAB の実装

uniqueそのオプションを使用して、その'rows'ような一意のペアの最初の出現を選択できます-

%// Assuming mat1 holds all the data
mat1 = [
1    0     5 0.08 0 58.809629 -134.19494 1759.6395 60.399998 4.530 202.90558
2    0     6 0.10 0 58.809629 -134.19494 1759.6395 60.279999 4.521 250.44923
3    0     7 0.12 0 58.809629 -134.19494 1759.6398 60.199997 4.515 202.77191
4    0     8 0.14 0 58.809629 -134.19494 1759.6398 60.199997 4.515 137.59879
5    0     9 0.16 0 58.809629 -134.19494 1759.6398 60.079998 4.506  76.98897
6    0    10 0.18 0 58.809629 -134.19494 1759.6398 59.959999 4.497  71.91417
7     0    11 0.20 0 58.809629 -134.194940 1759.6398 60.399998 4.530  -76.34547
8     0    12 0.22 0 58.809629 -134.194939 1759.6401 60.520000 4.539  -71.92880
9     0    13 0.24 0 58.809629 -134.194939 1759.6401 60.639999 4.548  -95.66286
10    0    14 0.26 0 58.809629 -134.194939 1759.6401 60.759998 4.557 -161.85239
11    0    15 0.28 0 58.809629 -134.194939 1759.6401 60.879997 4.566 -256.24988
12    0    16 0.30 0 58.809629 -134.194939 1759.6401 61.000000 4.575 -374.82968
13    0    17 0.32 0 58.809629 -134.194939 1759.6404 61.000000 4.575 -322.71951
14    0    18 0.34 0 58.809629 -134.194939 1759.6404 61.000000 4.575 -270.60934
15    0    19 0.36 0 58.809629 -134.194939 1759.6404 60.879997 4.566 -251.24893]

[~,v2,v3] = unique(mat1(:,6:7),'rows')
out = mat1(v2,:) %// desired output of unique pairs of lat and long values

代わりに、そのような一意のペアの最後の出現に関心がある場合は、代わりにこれを使用して、残りのコードを同じに保つことができます-

[~,v2,v3] = unique(mat1(:,6:7),'rows','last')

また、「時間」列の平均値を使用することについても話しましたが、これを使用できます-

valid1 = bsxfun(@eq,unique(v3),v3') %//'
out(:,9) = sum(bsxfun(@times,mat1(:,9)',valid1),2)./sum(valid1,2) %//' desired output with average values for "time"
于 2014-06-19T19:17:21.827 に答える
0

あなたの場所はduplicatedどこdfですかdata.frame

df[!duplicated(df[, c("lat", "long")]),]

データを集計する場合は、 を試してくださいdplyr。たとえば、次のようなことができます。

df %>% group_by(lat, long) %>% summarise(time = mean(time))
于 2014-06-19T19:29:29.333 に答える