在SAS中,如何有条件地折叠行,用表示值和的显式名称单行替代?
具体来说,我希望创建一个频率表,该表显示值子类的频率,但条件是该频率大于9。在任何其他情况下(频率<10),我希望频率计数到限制在值类的频率之和上。数据集中没有丢失或0值。
Freq Class Subclass
---------------------
20 1 1a
20 1 1b
2 1 1c
2 1 1d
2 1 1e
1 1 1f
22 2 2a
6 2 2b
2 2 2c
1 2 2d
31 3 3a
17 3 3b
7 3 3c
3 3 3d
3 3 3e 我目前的方法是使用以下方法生成第一个表:
proc sql;
create table as
select* count (distinct subjectID) as count
from DATASET1
group by Subclass
;
run; quit;期望的结果如下所示:
Freq Class Subclass
---------------------
20 1 1a
20 1 1b
7 1 OTHER (1c, 1d, 1e, 1f)
22 2 2a
9 2 OTHER (2b, 2c, 2d)
31 3 3a
17 3 3b
13 3 OTHER (3c, 3d, 3e) 优选地,我希望根据在行中表示的测量的标识符,另外显式地命名表示所加测量的子类值。在本例中,这将是总结的子类的名称。
我尝试使用Proc means过程,它生成频率<10的所有Subclasses的新数据集,而不是求和值。
发布于 2018-10-24 09:45:48
数据步骤是利用first.和last.语句获得首选输出的方法。这为您提供了输出值>9或将同一类中的其他值之和的选项。
call catx函数将连接子类值,因此您可以看到构成频率的是哪些值。
data have;
input Freq Class Subclass $;
datalines;
20 1 1a
20 1 1b
2 1 1c
2 1 1d
2 1 1e
1 1 1f
22 2 2a
6 2 2b
2 2 2c
1 2 2d
31 3 3a
17 3 3b
7 3 3c
3 3 3d
3 3 3e
;
run;
data want;
set have;
by class;
length subclass_groups $20 subclass_temp $20;
retain subclass_temp;
if first.class then call missing(freq_temp,subclass_temp);
if freq>9 then do;
subclass_groups = subclass;
output;
end;
else do;
freq_temp + freq;
call catx(',',subclass_temp,subclass);
end;
if last.class then do;
freq = freq_temp;
subclass_groups = subclass_temp;
output;
end;
drop subclass subclass_temp freq_temp;
run;发布于 2018-10-24 02:21:53
没有经过测试的代码,这将使您很容易理解如何使用union来解决这个问题。
proc sql;
create table as
select freq, class, subclass, count(subclass) as count
from DATASET1
where freq le 9
group by Subclass
union all
select freq, class, subclass, count(class) as count
from DATASET1
where freq ge 10
group by class;https://stackoverflow.com/questions/52959901
复制相似问题