SAS proc транспонирует и выводит в excel

Еще один вопрос SAS от меня (я заметил, что они не так часто появляются здесь...):

У меня есть набор данных, содержащий что-то вроде этого:

Name  |  Category  |   Level  |  Score
John  |    cat1    |     1    |    80
John  |    cat1    |     2    |    70
John  |    cat1    |     3    |    10
John  |    cat2    |     1    |    60
John  |    cat2    |     2    |    95
John  |    cat2    |     3    |    43
John  |    cat2    |     4    |    28

И вывод (в формате Excel) должен выглядеть так:

      |    cat1      |    cat2       |
name  | 1  |  2  | 3 | 1 | 2 | 3 | 4 | 
John  | 80 | 70  |10 |60 |95 |43 |28 |

Сейчас я использую proc transpose для получения данных в правильном порядке, а затем proc export для перехода к .xls.

Это работает нормально, за исключением одного. Я не могу заставить работать второй уровень подразделения. Итак, прямо сейчас, перед моим proc transpose, я на самом деле объединяю свою категорию и уровень в своем наборе данных (например, делая его «1_cat1»), а затем транспонирую это значение, что дает мне следующий результат:

name  | 1_cat1 |  2_cat1 | 3_cat1 | 1_cat2 | 2_cat2 | 3_cat2 | 4_cat2 | 
John  |   80   |    70   |   10   |   60   |   95   |   43   |   28   |

Есть ли способ получить первый желаемый результат?


person Yoh    schedule 05.05.2011    source источник
comment
Вопросы об SAS здесь возникают не так часто. Для более целенаправленного сообщества по SAS см. www.runsubmit.com   -  person Jay Stevens    schedule 06.05.2011


Ответы (2)


Предполагая, что вы знакомы с вашими ODS параметрами, чтобы получить их в Excel (я просто лениво использую html и сохраняю его как .xls, но вместо этого вы можете использовать наборы тегов и т. д.), вот решение PROC REPORT для отображения данных в формат, который вы ищете. Проверьте использование переменных across в отчете о процессах. Вероятно, есть способ подавить в выводе столбец, который не используется под cat1, но я не могу его вспомнить прямо сейчас.

data testData;
  infile datalines dsd delimiter='|';
  input name $ category $ level score;
  datalines;
John  |    cat1    |     1    |    80
John  |    cat1    |     2    |    70
John  |    cat1    |     3    |    10
John  |    cat2    |     1    |    60
John  |    cat2    |     2    |    95
John  |    cat2    |     3    |    43
John  |    cat2    |     4    |    28
;
run;

ods html file="C:\SomePath\MyFile.xls";

proc report
  data=testData;
  columns name category,level,score;
  define name / group;
  define category / across '';
  define level / across '';
  define score / sum '';
run;

ods html close;
person sasfrog    schedule 06.05.2011
comment
Спасибо еще раз. Я не так хорошо знаком с ODS, но буду изучать его подробнее, поскольку отчет о процедуре действительно дает нужный мне макет вывода. Только нужно получить его в мой xls сейчас. Только что попробовал с ods excelxp, все выглядит хорошо (кроме цветов :)). Но я боюсь, что столбец с отсутствующими значениями станет проблемой. - person Yoh; 06.05.2011

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

person RWill    schedule 05.05.2011
comment
Я попробовал отчет Proc с примером sasfrogs ниже и действительно указывает правильное направление для поиска моего решения. Также попробуем proc tabulate позже. Спасибо. - person Yoh; 06.05.2011