假设我有如下数据:
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;
答案 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步骤的解决方案将需要预先计算数据集统计信息,通常使用诸如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
答案 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;