SAS设定值小于平均值

时间:2018-11-25 21:58:07

标签: sas data-manipulation

假设我有如下数据:

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;

我想做的是使用数据和set语句说,如果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;

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

均值函数在数据步骤中跨行而不是列中应用,这就是为什么没有得到结果的原因。 @理查德答案是完美的。要在数据步骤中获取平均值,您需要使用DOW循环,然后附加主数据集。如@Richard所述,使用proc摘要要容易得多。

    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;