【问题标题】:SAS set value less than mean to missingSAS 设定值小于均值缺失
【发布时间】:2018-11-25 21:58:06
【问题描述】:

假设我有如下数据:

DATA temp;
  INPUT id a1 b2 d1 f8;
DATALINES;
1 2.3 2.1 4.2 1.2 
2 5.3 2.3 1.5 3.2
3 1.2 5.4 6.6 6.6
; 
run;

我想要做的是使用数据和集合语句来说明如果 a1 和 f8 中的值小于 a1 和 f8 的平均值(分别),那么这些值就丢失了。所以生成的数据集看起来像:

 id   a1   b2   d1   f8
  1    .  2.1  4.2    .
  2  5.3  2.3  1.5    .
  3    .  5.4  6.6  6.6

关于如何开始这方面的任何提示?我是 SAS 新手,手册中的示例并不是很有帮助。我一直在想这样的事情(但它不起作用):

DATA temp2;
    SET temp;
        IF a1 < mean(a1) THEN a1=.;
        IF f8 < mean(f8) THEN f8=.;
 RUN;

【问题讨论】:

    标签: sas data-manipulation


    【解决方案1】:

    SQL 的 SAS 实现可以针对结果集自动应用分组或数据聚合。

    Proc SQL;
      create table want as
      select
        case when (a1 < mean(a1)) then . else a1 as a1,
        b2,
        d1,
        case when (f8 < mean(f8)) then . else f8 as f8
      from have;
    

    使用 DATA 步的解决方案需要预先计算数据集统计信息,通常使用诸如 MEANSSUMMARYUNIVARIATE 之类的过程。

    proc means noprint data=have;
      output out=have_means mean(a1 f8)= / autoname;
    run;
    
    data want;
      if _n_ = 1 then do;
        set have_means(keep=a1_mean f8_mean);
      end;
    
      set have;
      if a1 < a1_mean then a1 = .;
      if f8 < f8_mean then f8 = .;
    
      drop a1_mean f8_mean;
    run;
    

    其他技术可以更新数据集并使用 SQL UPDATE 或 DATA 步 MODIFY

    【讨论】:

      【解决方案2】:

      mean 函数应用于数据步中的行而不是列内,这就是您没有得到结果的原因。 @Richard 的答案是完美的。要在 datastep 中获取平均值,您需要使用 DOW 循环,然后附加主数据集。正如@Richard 解释的那样,使用 proc summary 要容易得多。

          data temp2_intial(keep= mean_a1 mean_f8);
         do until(eof);
         set temp end =eof;
         tot_a1 = sum(tot_a1, a1);
         cnt_a1=sum(cnt_a1,1);
         mean_a1 = tot_a1/cnt_a1;
      
        tot_f8 = sum(tot_f8, f8);
        cnt_f8=sum(cnt_f8,1);
        mean_f8 = tot_f8/cnt_f8;
          end;
        run;
      
        data temp2(drop= mean_a1 mean_f8);
        set temp ;
        if _n_ =1 then set temp2_intial;
        IF a1 < mean_a1 THEN a1=. ;
       IF f8 < mean_f8 THEN f8=.;
        run;
      

      【讨论】:

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