【问题标题】:SAS proq SQL: Conditionally summing and collapsing rowsSAS proc SQL:条件求和和折叠行
【发布时间】:2018-10-24 01:28:18
【问题描述】:

在 SAS 中,如何有条件地折叠行,用一个明确命名的单行代替,表示值的总和?

具体来说,我希望创建一个频率表来显示值 子类 的频率,但条件是该频率大于 9。在任何其他情况下(频率 Class 的频率总和。数据集中没有缺失值或 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 过程,它会生成一个所有Subclasses 频率

【问题讨论】:

  • freq 7 在您的数据集中具有第 3 类。但它在想要的数据集中有class1。如果可能的话,你能展示你的初始样本数据集
  • 在 Class1 中,Subclass 1c、1,d、1e 和 1f 的频率分别为 2、2、2 和 1。这使得 Class1 中频率

标签: sql sas sum proc proc-sql


【解决方案1】:

使用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;

【讨论】:

    【解决方案2】:

    未经测试的代码,这将使您更容易理解如何使用联合解决问题。

     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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多