这是对previous question的跟进,它只考虑了一个带有两个子组的变量。在该问题中,解决方案是通过对数据进行排序来对子组进行排序。
然而,当存在多个变量时,这种方法就会崩溃。它变成了将变量分类成产生所需结果的序列的重要因素。每个后续BY
变量子组都取决于之前的级别。如果并非所有子组都存在于更高级别的组中,则并非所有子组都可以按所需顺序排列。
PROC TABULATE
不是适合此任务的工具(即获得跨多个变量的各种组的百分比),或者有一种技术允许子组独立于数据进行排列。
我是否需要在文档大海捞针中挖针?还是重新发明轮子?你能给我的任何见解都会受到赞赏。
示例:
为了举例说明,我想创建一个表,其中每个变量的子组以(Y,N)顺序排列。请注意var4
如何以正确的顺序输出。在对其他变量进行排序时,没有足够的var4
值存储在所需的顺序中。
data example;
input group $ var1 $ var2 $ var3 $ var4 $;
datalines;
1 Y Y N Y
1 N Y N N
2 Y N Y N
2 Y Y Y N
3 N N N Y
3 N Y Y N
;
run;
proc sort data = example out = sorted;
by descending var1
descending var2
descending var3
descending var4
;
run;
title 'Percent';
proc tabulate data = sorted order = data;
class group var1 var2 var3 var4;
table group='Group',
all = 'Total'*pctn=''
var1 = 'Variable 1'*pctn=''
var2 = 'Variable 2'*pctn=''
var3 = 'Variable 3'*pctn=''
var4 = 'Variable 4'*pctn='';
run;
有可能在BY
中设计PROC SORT
变量的组合,它们给出(Y,N)子分组顺序,但它会涉及一堆对变化不稳健的摆弄在数据中。如果表需要每月更新一次,那么每个月你都必须摆弄排序。
答案 0 :(得分:1)
无需解决方法或重新发明所需的轮子 - 这正是classdata数据集的用途:
data example;
input group (var1-var4) ($1. +1);
datalines;
1 Y Y N Y
1 N Y N N
2 Y N Y N
2 Y Y Y N
3 N N N Y
3 N Y Y N
;
run;
data classtypes;
do group = 1 to 3;
do var1 = 'Y','N';
do var2 = 'Y','N';
do var3 = 'Y','N';
do var4 = 'Y','N';
output;
end;
end;
end;
end;
end;
run;
title 'Percent';
proc tabulate data = example order = data classdata=classtypes;
class group var1 var2 var3 var4;
table group='Group',
all = 'Total'*pctn=''
var1 = 'Variable 1'*pctn=''
var2 = 'Variable 2'*pctn=''
var3 = 'Variable 3'*pctn=''
var4 = 'Variable 4'*pctn='';
run;
作为奖励,这也避免了必须对主输入数据集进行排序 - 输出表中的行/列顺序由classdata数据集的顺序决定。