Как сгруппировать в MATLAB по 2 столбцам

#matlab #group-by #statistics #mean

#matlab #группировать по #Статистика #имеется в виду

Вопрос:

У меня есть данные, хранящиеся в табличном формате как

 data = table(['A';'B';'A';'A';'B'], datetime('now')-days([1;2;1;2;2]), rand(5,1)*100, 'VariableNames', {'Stock','Date','Open'})
  

Вывод вышеуказанных данных

    Stock            Date             Open 
   _____    ____________________    ______

    A        28-Aug-2020 07:51:36    81.472
    B        27-Aug-2020 07:51:36    90.579
    A        28-Aug-2020 07:51:36    12.699
    A        27-Aug-2020 07:51:36    91.338
    B        27-Aug-2020 07:51:36    63.236
  

Я хочу вычислить среднее значение, Open сгруппированное по Stock и Date .
Желаемый результат был бы

  Stock            Date            GroupCount    mean_Open
 _____    ____________________    __________    _________
  A       27-Aug-2020 16:27:51        1          91.338  
  A       28-Aug-2020 16:27:51        2          47.086  
  B       27-Aug-2020 16:27:51        2          76.908  
  

Что я пробовал:

Первая попытка

 mu = varfun(@mean, data,'GroupingVariables',{'Stock', 'Date'},'InputVariables','Open')
  

Ошибка из приведенного выше кода:

 Error using tabular/varfun (line 206)
Not enough input arguments.
  

Если сгруппировать по одной переменной, я могу получить результаты, например, приведенный ниже код работает:

 mu = varfun(@mean, data,'GroupingVariables','Stock','InputVariables','Open')
  

Вывод:

 Stock    GroupCount    mean_Open
_____    __________    _________

A        3             61.836   
B        2             76.908   
  

Вывод из

 which mean -all

C:Program FilesMATLABR2017btoolboxmatlabdatafunmean.m
C:Program FilesMATLABR2017btoolboxmatlabbigdata@tallmean.m              % tall method
C:Program FilesMATLABR2017btoolboxmatlabtimefun@durationmean.m          % duration method
C:Program FilesMATLABR2017btoolboxmatlabtimefun@datetimemean.m          % datetime method
C:Program FilesMATLABR2017btoolboxdistcompparallel@codistributedmean.m  % codistributed method
C:Program FilesMATLABR2017btoolboxdistcompgpu@gpuArraymean.m            % gpuArray method
C:Program FilesMATLABR2017btoolboxfinanceftseries@fintsmean.m           % fints method
C:Program FilesMATLABR2017btoolboxmbcmbctools@sweepsetmean.m            % sweepset method
C:Program FilesMATLABR2017btoolboxstatsstats@ProbDistUnivParammean.m    % ProbDistUnivParam method
C:Program FilesMATLABR2017btoolboxmatlabtimeseries@timeseriesmean.m     % timeseries method
  

Вывод из:

 which('mean','in','varfun')

C:Program FilesMATLABR2017btoolboxmatlabdatafunmean.m
  

Вторая попытка

 [G,tabout] = findgroups(data(:,{'Stock','Date'}));
tabout.avgOpen = splitapply(@mean,data.Open,G);
  

ошибка из приведенного выше фрагмента кода:

 Error using findgroups (line 86)
Unable to use a character array as a grouping variable.  First convert the character array to a cell array of character vectors using cellstr. Then specify the cell array as
a grouping variable.
  

Комментарии:

1. Не могли бы вы уточнить, каков желаемый результат? Это кажется неполным

2. @Paolo Я добавил желаемый результат вместе со значениями.

3. Прохладный. Эти даты выглядят неправильно, хотя?

4. Вероятно, было бы проще предоставить пример воспроизведения с фиксированными данными вместо случайных

5. @Paolo Меня меньше всего волнуют даты, однако я это исправил. Числа генерируются случайным образом. Если вы можете предоставить решение, используя любые даты, любые цены или любую категорию, этого было бы достаточно, и у меня нет проблем с этим. Проблема здесь в том, что код не работает. Если вы можете сообщить мне, как заставить это работать независимо от данных, я не буду возражать против принятия этого ответа. Но концепция группировки по 2 столбцам должна быть рассмотрена в ответе.