SAS proc транспонировать и выводить, чтобы преуспеть - PullRequest
2 голосов
/ 05 мая 2011

Еще один вопрос 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   |

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

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Предполагая, что вы знакомы с вашими опциями ODS, чтобы получить его в Excel (я просто лениво использую html и сохраняю его как .xls, но вы могли бы вместо этого использовать tagset и т. Д.), Вот PROC REPORT решение для отображения данных в формате, который вы ищете.Проверьте использование across переменных в отчете proc.Возможно, есть способ подавить столбец, который не используется под 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;
1 голос
/ 06 мая 2011

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

...