我正在处理一个非常大的数据集,并且遇到了我以前没有遇到的独特问题。这是雷达数据,与GPS点配对。通过雷达处理,我在数据点之间插值以平滑雷达图像以选择视野。导出后,我现在每个实际点都有多个点(注意重复的lat和long条目)。这是插值的人为因素,而不是真实的数据。我想要做的是为每个唯一的lat和long选择一个条目,并将其粘贴到一个新的数据框中。我还没有决定我是想平均时间,还是随机选择,但我还没有成功地尝试配对独特的配对。我的困境是每列中有大约4000个唯一值,因此简单的for循环似乎不符合我的需要。我的数据顶部的样本如下。完整的数据集是70,000行。
我非常精通Matlab和R.所以无论哪个提供更简单的解决方案都很好。
TL; DR:选择每个分组的lat和long对,并将该组的单个条目导出到新文件
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
答案 0 :(得分: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')
您还谈到了使用" time"的平均值。我相信,你可以使用这个 -
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"
答案 1 :(得分:0)
我使用了duplicated
,其中df
是您的data.frame
:
df[!duplicated(df[, c("lat", "long")]),]
如果您要汇总数据,请尝试dplyr
。例如,你可以这样做:
df %>% group_by(lat, long) %>% summarise(time = mean(time))