选择具有唯一对的多个行,并为所有可能的对导出随机选择

时间:2014-06-19 19:04:46

标签: r matlab data-manipulation data-management

我正在处理一个非常大的数据集,并且遇到了我以前没有遇到的独特问题。这是雷达数据,与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

2 个答案:

答案 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))