SAS транспонировать с использованием значений в качестве имен столбцов и суммировать

Я пытаюсь транспонировать данные, используя значения в качестве имен переменных, и суммировать числовые данные по группам, я пытался с помощью proc transpose и с помощью отчета proc (через), но я не могу этого сделать, единственный известный мне способ - с набором данных (если еще и сумма, но изменения не происходят динамически)

Например, у меня есть этот набор данных:

school name   subject      picked  saving   expenses
raget  John   math         10      10500    3500
raget  John   spanish      5       1200     2000
raget  Ruby   nosubject    10      5000     1000
raget  Ruby   nosubject    2       3000      0
raget  Ruby   math         3       2000     500
raget  peter  geography    2       1000      0
raget  noname nosubject    0        0       1200

и мне нужно это в 1 строке, сумма "выбранных" по именам студентов, а затем сумма выбранных по предмету, последние 3 столбца - это общая сумма для выбранных, сэкономленных средств и расходов:

school john ruby peter noname math spanish geography nosubject  picked saving expenses 
raget   15   15   2      0     13   5        2         12        32     22700  8200

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

2 ответа

Решение

Это немного сложно, потому что вы суммируете на нескольких уровнях, поэтому я использовал PROC SUMMARY и выбрал разные _TYPE_ ценности. Увидеть ниже:

данные есть;
  инфильные линии;  
  входная школа $ name $ предмет: $10. выбрал сберегательные расходы;; линиям передачи данных
raget  John   math         10      10500    3500
Рагет Джон испанский 5       1200     2000
raget  Ruby   nosubject    10      5000     1000
raget  Ruby   nosubject    2       3000      0
Рагет Руби математика 3       2000     500
Рагет Питер география 2       1000      0
raget  noname nosubject    0        0       1200;
бежать;

сводные данные proc = есть;
  название предмета школьной школы;
  Вар выбрал сбережения расходов;
  выход = сумма желания1 (выбрано) = сумма выбрано (экономия) = сумма накопления (расходы) = расходы;
бежать;

proc transpose data = want1 (где =(_type_=5)) out=subs (где =(_NAME_='selected'));
  по школе;
  идентификатор субъекта;
бежать;

proc transpose data = want1 (где =(_type_=6)) out=names (где =(_NAME_='selected'));
  по школе;
  идентификационное имя;
бежать;

proc sql;
  хотите создать таблицу (drop=_TYPE_ _FREQ_ name subject) как
  Выбрать
  п.*,
  s.*,
  ш. *
  из want1 (где =(_TYPE_=4)) w,
  имена (drop=_NAME_) n,
  sub (drop=_NAME_) s
  где w.school = n.school
  и w.school = s.school;
уволиться;

Я также проверил этот код, добавив новые школы, названия и предметы, и они появляются в финальной таблице. Вы заметите, что я ничего не кодировал (например, нет ссылки на math или же John), поэтому код достаточно динамичен.

PROC REPORT - интересная альтернатива, особенно если вы хотите печатать вывод, а не как набор данных. Ты можешь использовать ODS OUTPUT чтобы получить выходной набор данных, но это грязно, так как имена переменных по какой-то причине не определены (они "C2" и т. д.). Выходные данные этого документа также немного беспорядочные, поскольку строки заголовков не совпадают, но при желании это можно исправить с помощью некоторой ошибки.

data have;
input school $ name   $ subject      $ picked  saving   expenses;
datalines;
raget  John   math         10      10500    3500
raget  John   spanish      5       1200     2000
raget  Ruby   nosubject    10      5000     1000
raget  Ruby   nosubject    2       3000      0
raget  Ruby   math         3       2000     500
raget  peter  geography    2       1000      0
raget  noname nosubject    0        0       1200
;;;;
run;

ods output report=want;
proc report nowd data=have;
columns school (name subject),(picked) picked=picked2 saving expenses;
define picked/analysis sum ' ';
define picked2/analysis sum;
define saving/analysis sum ;
define expenses/analysis sum;
define name/across;
define subject/across;
define school/group;
run;
Другие вопросы по тегам