2013-09-27 4 views
0

У меня есть массив ячеек, в котором некоторые элементы имеют две точки данных. Я хочу усреднить два данных, если данные были собраны в тот же день.MATLAB Cell Array - Средние два значения, если другой столбец соответствует

Первый столбец «сайт» ячейки - это дата. Четвертая колонка - это концентрация данных. Я хочу усреднить четвертый столбец, если данные поступают с того же дня.

Например, если мой массив ячеек выглядит следующим образом:

01/01/2011 36-061-0069 1 10.4 
01/01/2011 36-061-0069 2 10.1 
01/04/2011 36-061-0069 1 7.9 
01/05/2011 36-061-0069 1 13 

Я хочу усреднить четвертый столбец (10.4 и 10.1) в один ряд и оставить все остальное то же самое.

Помощь? Будет ли цикл ifififif? Я не уверен, как подойти к этой проблеме, тем более, что массивы ячеек работают немного иначе, чем матрицы.

ответ

3

Вы можете сделать это сжато без контура, используя комбинацию unique, diff и accumarray.

Определить данные:

data = {'01/01/2011' '36-061-0069' '1' '10.4'; 
     '01/01/2011' '36-061-0069' '2' '10.1'; 
     '01/04/2011' '36-061-0069' '1' '7.9'; 
     '01/05/2011' '36-061-0069' '1' '13'}; 

Тогда:

dates = datenum(data(:,1),2); % mm/dd/yyyy format. Change "2" for other formats 
[dates_sort ind_sort] = sort(dates); 
[~, ii, jj] = unique(dates_sort); 
n = diff([0; ii]); 
result = accumarray(jj,vertcat(str2double(data(ind_sort,4))))./n; 

дает желаемый результат:

result = 

    10.2500 
    7.9000 
    13.0000 

При необходимости, вы можете получить не-повторен, отсортированные даты с data(ind_sort(ii),1) ,

Объяснение кода: даты сначала преобразуются в цифры и сортируются. Затем извлекаются уникальные даты и повторяющиеся даты. Наконец, данные в повторяющихся строках суммируются и делятся на количество повторений для получения средних значений.

вопросы совместимости для Matlab 2013a, начиная:

Функция unique имеет в Matlab 2013a changed. Для этой версии и далее, добавить 'legacy' флаг unique, т.е. заменить строку [~, ii, jj] = unique(dates_sort) на

[~, ii, jj] = unique(dates_sort,'legacy') 
+0

К чему относятся ii и jj? Я пытаюсь использовать ваш код, так как кажется, что это именно то, что мне нужно, но я не могу сделать vertcat, потому что мои ii и jj теперь имеют разную длину. ii и n имеют одинаковую длину, а jj больше. У моего массива данных нет кавычек (''). Не знаю, имеет ли это значение. – shizishan

+0

Это нормально, что ii и jj имеют разную длину. ii содержит индексы даты без повторений, а jj содержит все даты, указывающие, что они повторяются. Какую ошибку вы получаете? И как у вас данных нет котировок? Разве это не массив ячеек со строками в первых двух столбцах? –

+0

@ user2258883 Другое дело: какую версию Matlab вы используете? Лоток меняет '~' именем фиктивной переменной, таким как 'aux' –

0

Похоже, что вы хотите сделать:

for it = 1:size(CellArray,1) 
    sum = sum + cellArray{it}(4) % or .NameOfColumn if it a cell containing struct 
end 

mean(sum) 
+0

Это дает мне ошибку говоря «Ошибка использования суммы, не хватает входных параметров. – shizishan

+0

Кроме того, я не хочу находить среднее значение всей четвертой колонки. Я хочу только найти среднее число строк, где совпадает первый столбец (дата). Все нужно оставить в покое. – shizishan

+0

Извините, я этого не видел. Но ответ LuisMendo кажется хорошим. – Vuwox

Смежные вопросы