2015-07-21 4 views
3

Я пытаюсь создать таблицу, которая содержит итоговые значения для каждой группы. У меня есть разделы, подразделы и элементы. После каждого подраздела должна появиться строка с итогами этого подраздела и после каждого раздела строка с общей суммой раздела.Tabulate With Category as Label

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

Пример 1

Сначала небольшой пример, чтобы проиллюстрировать, ниже я есть полный пример работает , который показывает то, что я пытался с Proc tablulate и что я хотел бы достичь.

Входные данные

============================== 
Group Group2 Item Weight 
----- ------ ---- ------ 
Mammals Cats Lion  215 
Mammals Cats Cheetah  70 
Mammals Dogs Wolf  80 
Mammals Dogs Jackal  45 
============================== 

желаемого результата

=================== 
Group/Item Weight 
----------- ------ 
    Lion  215 
    Cheetah  70 
    Cats   285 
----------- ------ 
    Wolf   80 
    Jackal  45 
    Dogs   125 
----------- ------ 
Mammals   410 
=================== 

Пример 2

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

data animals; 
input group1 $ group2 $ animal $ weight; 
datalines; 
Mammals Cats Lion 215 
Mammals Cats Cheetah 70 
Mammals Cats Leopard 65 
Mammals Dogs Wolf 80 
Mammals Dogs Jackal 45 
Birds Raptors Eagle 6 
Birds Raptors Hawk 5 
Birds .  Duck 2 
.  .  Snake 3 
; 

Моя неудачная попытка, таблица слишком сложна

PROC TABULATE DATA=ANIMALS OUT=ANIMAL_SUMMARY; 
    VAR weight; 

    CLASS group1/ORDER=DATA MISSING; 
    CLASS group2/ORDER=DATA MISSING; 
    CLASS animal/ORDER=DATA MISSING; 

TABLE group1*(group2*(animal Sum) Sum) Sum, weight; 
RUN; 

форма данных, близких к желаемому результату

data target; 
input group1 $ group2 $ animal $ weight; 
datalines; 
. . Lion 215 
. . Cheetah 70 
. . Leopard 65 
. Cats . 350 
. . Wolf 80 
. . Jackal 45 
. Dogs . 125 
Mammals . . 475 
. . Eagle 6 
. . Hawk 5 
. Raptors . 11 
. . Duck 2 
Birds . . 13 
. . Snake 3 
. . . 491 
; 

ответ

1

Я не думаю, что вы можете получить точно то, что вы хотите от Tabulate , Вам, вероятно, придется пойти в Report, чтобы получить именно то, что вы хотите.

Вы можете приблизиться.

PROC TABULATE DATA=ANIMALS OUT=ANIMAL_SUMMARY; 
    VAR weight; 

    CLASS group1/ORDER=DATA MISSING; 
    CLASS group2/ORDER=DATA MISSING; 
    CLASS animal/ORDER=DATA MISSING; 

TABLE group1*(group2*(animal=' ' Sum=' '*group2=' ') Sum=' '*group1=' ') Sum='Total', weight; 
RUN; 

Я добавляю group2 и group1 здесь, и удаление кучу ярлыков. По какой-то причине он не удаляет все ярлыки, но он удаляет большинство из них и получает вашу группу2/group1 в правой строке.

Это также дает предупреждение:

Предупреждение: переменная класса пересекается с самим собой в отчете таблицы в строке 313. Это может привести к непредсказуемым результатам.

Это прекрасно, в этом случае, но просто имейте в виду (особенно если ваш магазин является магазином «чистого журнала», в этом случае это может не работать).

Более того, я думаю, вам нужно будет перейти к PROC REPORT, чтобы это сделать, что вполне возможно сделать (REPORT с удовольствием делает промежуточные строки с RBREAK, например).

+0

Особое спасибо за предложение использовать 'PROC REPORT', мне нужно будет больше читать об этом, но, похоже, оно больше подходит для задачи. – Leonhard