0

我正在处理一个非常大的数据集,并且遇到了一个我以前从未遇到过的独特问题。这是与 GPS 点配对的雷达数据。通过雷达处理,我在数据点之间进行插值以平滑雷达图像以选择视野。导出后,我现在每个实际点都有多个点(注意重复的经纬度条目)。这是该插值的产物,而不是真实数据。我想做的是为每对唯一的经纬度选择一个条目,然后将其粘贴到一个新的数据框中。我还没有决定是要平均时间还是随机选择,但是我在尝试配对独特的配对时还没有成功。我的困境是每列中有大约 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

我用duplicateddf你的位置data.frame

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

如果要聚合数据,请尝试dplyr. 例如,您可以执行以下操作:

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