首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SAS :有条件地求和和折叠行

SAS :有条件地求和和折叠行
EN

Stack Overflow用户
提问于 2018-10-24 01:28:18
回答 2查看 348关注 0票数 0

在SAS中,如何有条件地折叠行,用表示值和的显式名称单行替代?

具体来说,我希望创建一个频率表,该表显示值子类的频率,但条件是该频率大于9。在任何其他情况下(频率<10),我希望频率计数到限制在值类的频率之和上。数据集中没有丢失或0值。

代码语言:javascript
运行
复制
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        

我目前的方法是使用以下方法生成第一个表:

代码语言:javascript
运行
复制
proc sql;
   create table as
   select* count (distinct subjectID) as count
   from DATASET1 
   group by Subclass
   ; 
run; quit;

期望的结果如下所示:

代码语言:javascript
运行
复制
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的新数据集,而不是求和值。

EN

回答 2

Stack Overflow用户

发布于 2018-10-24 09:45:48

数据步骤是利用first.last.语句获得首选输出的方法。这为您提供了输出值>9或将同一类中的其他值之和的选项。

call catx函数将连接子类值,因此您可以看到构成频率的是哪些值。

代码语言:javascript
运行
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2018-10-24 02:21:53

没有经过测试的代码,这将使您很容易理解如何使用union来解决这个问题。

代码语言:javascript
运行
复制
 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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52959901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档