当另一列重复时,一列中的平均值

时间:2014-11-20 03:18:09

标签: matlab find average

我在MATLAB中有一个看起来像这样的表(仅用于说明目的。数字不一定正确):

Monitor ID              POC Latitude    Longitude   Date Local  Mean  Date Num
'01-003-0010-88101'     1   30.498001   -87.881412  1/1/2012    6.7   734869
'01-003-0010-88101'     3   30.498001   -87.881412  1/4/2012    9     734872
'01-003-0010-88101'     1   30.498001   -87.881412  1/7/2012    6.5   734875

'01-073-0023-88101'     1   33.447867   -117.088649 1/22/2012   8     734890
'01-073-0023-88101'     3   33.447867   -117.088649 1/22/2012   6     734890
'01-073-0023-88101'     9   33.447867   -117.088649 1/22/2012   9.6   734890

可以在此处找到包含更多列的完整表: https://www.dropbox.com/s/q6psz0eqhf1c7gl/data_PM25_table.mat.mat?dl=0

我想要做的是,如果数据来自同一天的同一个地方,那么平均最后一列(算术平均值)。

因此,如果在Date Num相同时重复监视器ID(即,一个监视器在特定日期具有多个值,则平均算术平均值。

我上面给出的表格有两个例子来说明我的意思。

  • 前三行是我独自留下的 - 日期不同所以这是三天不同的数据。我会在这些日子里添加一个号码为'1'POC的新colomn。

  • 然而,此后的三行具有相同的日期,具有不同的POC值。在这种情况下,我将平均三个平均值,因为测量来自同一天的同一个地方。

我只想在同一天保留其中一行来自同一个地方的数据。

因此在处理之后,我希望表(可以是新表)看起来像这样:

Monitor ID              POC Latitude    Longitude   Date Local  Mean  Date Num   Counter
'01-003-0010-88101'     1   30.498001   -87.881412  1/1/2012    6.7   734869     1
'01-003-0010-88101'     3   30.498001   -87.881412  1/4/2012    9     734872     1
'01-003-0010-88101'     1   30.498001   -87.881412  1/7/2012    6.5   734875     1

'01-073-0023-88101'     1   33.447867   -117.088649 1/22/2012   7.9   734890     3

我该怎么做?

1 个答案:

答案 0 :(得分:0)

不要尝试对整个表格执行此操作,而是单独拉出每个站点。然后,对日期进行排序,查找这些日期重复的位置以及次数。有了这个,很容易找到平均值。

for m = 1:length(u_id) % Run through one site at a time
    k = u_id(m); % Site under consideration

    ind1 = find(strcmp(data_PM25.MonitorID, k) == 1); % Find where a site has data
    d1 = data_PM25(ind1,:); % Data set with only one site
    [dates_sort ind_sort] = sort(cell2mat(d1.DateNum)); % Sort the dates
    d1 = d1(ind_sort,:); % Make sure the entire table is sorted in the same way

    [aa, ii, jj] = unique(dates_sort,'legacy'); % Unique dates
    n = diff([0; ii]); % Find how many times each monitor repeats on one day
    result = accumarray(jj,vertcat(d1.ArithmeticMean(ind_sort)))./n; % Data in repeated rows are summed and divided by the number of repetitions to obtain the averages

    d2 = d1(ii,:); % Create dataset with only the average of the arithmetic means
    d2.ArithmeticMean = result; % Set the Arithmetic Mean to the new averaged mean over all POCs at a site on a particular day
    d2.NumberOfPOCs = n; % Number of POCs being averaged together
end