我希望将列放在SAS数据集中,该数据集的总和小于特定值。考虑下面的情况。
Column_A Pred_1 Pred_2 Pred_3 Pred_4 Pred_5
A 1 1 0 1 0
A 0 1 0 1 0
A 0 1 0 1 0
A 0 1 0 1 1
A 0 1 0 0 1
让我们假设我们的阈值是4,所以我希望丢弃具有小于4的活动观测值之和的预测变量,因此输出看起来像
Column_A Pred_2 Pred_4
A 1 1
A 1 1
A 1 1
A 1 1
A 1 0
目前我正在使用一种非常低效的方法来使用多个转置来删除预测变量。有多个记录>的数据集; 30,000这样的转置方法需要时间。如果有人有更有效的解决方案,我将不胜感激!
谢谢!
答案 0 :(得分:2)
好像你可以这样做:
PROC MEANS
或类似的proc以获得总和然后没有TRANSPOSE
或者其他什么,只是常规的简单旧摘要和丢弃。请注意,您应使用ODS OUTPUT
而不是OUT=
中的PROC MEANS
,否则您必须PROC TRANSPOSE
正常的PROC MEANS
OUT=
数据集。
使用普通数据集的示例:
data have;
array x[20];
do _n_ = 1 to 20;
do _i = 1 to dim(x);
x[_i] = rand('Uniform') < 0.2;
end;
output;
end;
run;
ods output summary=have_sums; *how we get our output;
ods html select none; *stop it from going to results window;
proc means data=have stackodsoutput sum; *stackodsoutput is 9.3+ I believe;
var x1-x20;
run;
ods html select all; *reenable normal html output;
%let threshhold=4; *your threshhold value;
proc sql;
select variable
into :droplist_threshhold separated by ' '
from have_sums
where sum lt &threshhold; *checking if sum is over threshhold;
quit;
data want;
set have;
drop &droplist_threshhold.; *and now, drop them!;
run;
答案 1 :(得分:1)
只需使用PROC SUMMARY
即可获得总和。然后,您可以使用数据步骤生成要删除的变量名称列表。
%let threshhold=4;
%let varlist= pred_1 - pred_5;
proc summary data=have ;
var &varlist ;
output out=sum sum= ;
run;
data _null_;
set sum ;
array x &varlist ;
length droplist $500 ;
do i=1 to dim(x);
if x(i) < &threshhold then droplist=catx(' ',droplist,vname(x(i)));
end;
call symputx('droplist',droplist);
run;
然后,您可以使用宏变量生成DROP
语句或DROP=
数据集选项。
drop &droplist;