Sas работает с наблюдениями

Я новичок в SAS, но знаком с R, MATLAB и Stata.

Одна вещь, которую я еще не смог найти во время исследования, - это способность работать с отдельными наблюдениями по всему набору данных. Предположим, что этот набор данных - это то, над чем я работаю на каждом этапе пути:

Stock     Volume1 Volume2 Volume3
Apple     200     100     101
Amazon    150     1000    1020
Facebook  135     80      85
Google    80      75      80

Приведу несколько примеров того, что я собираюсь делать.

  1. Взяв среднее значение объемов сегментов 2 и 3, я выведу таблицу:

    Volume (Avg)
    142.5
    
    1. Более того, я бы хотел взять среднее значение нескольких столбцов в этих сегментах, например.

      Stock     Volume1 Volume2 Volume3 Volume Average
      Apple     200     100     101     133.67
      Amazon    150     1000    1020    723.33
      
                                        428.50
      
      Facebook  135     80      85      100
      Google    80      75      80      78.33
      
                                        89.165
      
                                                        258.8325
      

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


person 78282219    schedule 23.02.2018    source источник
comment
Я только что нашел группу функций SQL внутри агрегатных функций, думаю, это может быть хорошей отправной точкой.   -  person 78282219    schedule 23.02.2018


Ответы (2)


Ваш вопрос сформулирован не очень хорошо, поэтому я попытаюсь поделиться некоторыми идеями, а затем мы сможем обсудить.

Вы можете добавить идентификатор строки в набор данных:

data yourdata2;
set yourOriginalData;
rownum = _N_;
run;

тогда вы можете использовать любой из различных способов вычисления средств:

proc sql;
create table your_summarydata as
select avg(volume) as vol_mean
from yourdata2
where rownum in (2,3);
quit;

Я развивал вашу первоначальную идею. Я бы не рекомендовал проводить какие-либо серьезные расчеты по этому методу. В реальном мире я бы создал некоторую классифицирующую переменную, для которой я хотел бы вычислить средние значения, а затем использовал бы что-то вроде:

proc sql;
create table your_summarydata as
select groupvar, avg(volume) as vol_mean
from yourdata2
where 1=1 /* where conditions go here if you want to restrict the input dataset before calculations */
group by groupvar
quit;
person jmr    schedule 23.02.2018
comment
Прошу прощения, я просто редактировал таблицу, чтобы лучше донести свои идеи. - person 78282219; 23.02.2018
comment
Row num и Col num, кажется, то, что я ищу. В общем, я ищу синтаксис, который позволяет мне точно определить, с каким кластером наблюдений я работаю, например если я хочу работать только со строками 2-4 и столбцами 3-8 и найти среднее значение этих наблюдений. Ценю вашу помощь. - person 78282219; 23.02.2018
comment
В порядке. Афаик, SAS так не работает. SAS использует данные во многом аналогично SQL-базам данных: у вас есть строки (на которые вы можете указать с помощью rownum), и у вас есть столбцы, к которым вы можете получить доступ, используя имена столбцов, а не номера столбцов. При этом есть способ создавать многомерные массивы в пошаговом режиме, но я не эксперт в этом вопросе. Придется поискать документацию позже, если у меня будет время. - person jmr; 23.02.2018
comment
Я взглянул на ваши новые таблицы .. Есть ли среднее значение объемов, которое вы хотели бы получить в этой таблице, равное 428,5, 89,165 и 258,8325? Если так, я бы указал вам на свой предыдущий ответ; создайте классифицирующую переменную, которую вы можете объединить с помощью group by или какой-либо другой процедуры SAS. Кроме того, существует модуль SAS IML, который позволяет вам писать обычные операции алгебры Marix, но я думаю, что он не является частью какой-либо обычной настройки SAS. - person jmr; 23.02.2018

Ваш вопрос очень широкий, но вот пара основных связанных примеров:

data have;
input Stock $ Volume1 Volume2 Volume3;
cards;
Apple     200     100     101
Amazon    150     1000    1020
Facebook  135     80      85
Google    80      75      80
;
run;

data row_means;
  set have;
  volume_mean = mean(of volume1-volume3);
run;

proc summary data = have;
  var volume1-volume3;
  output out = column_means mean=;
run;

Для более гибко настраиваемого вывода, похоже, вас также могут заинтересовать proc report или proc tabulate, но подробное руководство по их использованию выходит за рамки этого сайта.

person user667489    schedule 23.02.2018