Заданное значение SAS меньше среднего значения отсутствует - PullRequest
0 голосов
/ 26 ноября 2018

Допустим, у меня есть данные, которые выглядят так:

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 голосов
/ 26 ноября 2018

средняя функция применяется к строке, а не к столбцу в шаге данных, поэтому вы не получаете результаты.Ответ @Richard идеален.чтобы сделать в шаге данных, чтобы получить среднее значение, вы должны использовать цикл DOW и затем добавить с основным набором данных.Как объясняет @Richard, гораздо проще использовать сводку процедур.

    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;
0 голосов
/ 26 ноября 2018

Реализация SAS в SQL может автоматически применять групповые или интеллектуальные агрегаты к результирующему набору.

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, должно предварительно рассчитать статистику набора данных, обычно с процедуройтакие как MEANS, SUMMARY или UNIVARIATE.

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

...