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;