
[英]Filling missing values for many variables from previous observation by group in SAS
[英]Proportion of the variables in each observation that satisfy certain conditions in SAS
HAVE是一个 SAS 数据集,包含 1700 个观测值和约 1,000 个变量。 除了 id 之外,还有三种“类型”的变量。 它们由不同的前缀表示。 这是文件的一个子集:
id a_dog b_dog c_dog a_cat b_cat c_cat a_mouse b_mouse c_mouse ...
prsn1 1 -1 -2 2 2 0 1 4 1
prsn2 -1 -3 4 2 2 -1 0 -1 -1
...
我需要根据变量的类型(即( a_ 、 b_或c_ )计算每个受访者高于、低于或等于零的值的比例。解决方案应将这些新变量附加到文件中:
... prop_a_gt0 prop_a_lt0 prop_a_eq0 prop_b_gt0 prop_b_lt0 prop_b_eq0 prop_c_gt0 prop_c_lt0 prop_c_eq0
... 1.0000 0.0000 0.0000 0.6667 0.3333 0.0000 0.3333 0.3333 0.3333
... 0.3333 0.3333 0.3333 0.3333 0.6667 0.0000 0.3333 0.6667 0.0000
注意如何prop_b_gt0,例如是0.6667为prsn1因为两个prsn1行三个B_变量具有值大于0。
我不知道如何系统地完成这个。 也许有一种方法可以将数组与 proc sql 步骤结合起来? 欢迎任何解决方案!
使用数组,您将需要遍历数组并计算更大的数字(并可能计算未丢失的数字)。
data want;
set have ;
array a a_: ;
numerator=0;
denominator=0;
do index=1 to dim(a);
numerator=sum(numerator,a[index]>0);
denominator=sum(denominator,not missing(a[index]));
end;
prob_a_gt0=numerator/denominator;
drop index numerator denominator;
run;
只需复制 B 和 C 变量的代码块。
对于超过三个数组(按变量名后缀 A、B、C 分组)的情况,宏将有助于确保在复制和粘贴(代码复制)过程中不会发生拼写错误或杂散编辑。
假设宏compute_proportions发出代码,该代码在DATA 步中定义的变量数组上循环。 代码生成器在循环期间计算每个条件满足的条件,并计算循环后的比例。
* simulate data;
data have;
array a a_1-a_300; * for simplicity, presume 1 to 300 correspond to dog, cat, mouse, ...;
array b b_1-b_300;
array c c_1-c_300;
call streaminit(123);
do id = 1 to 10;
do _n_ = 1 to dim(a);
a (_n_) = ceil(rand('uniform', 9)) - 5;
b (_n_) = ceil(rand('uniform', 9)) - 5;
c (_n_) = ceil(rand('uniform', 9)) - 5;
end;
output;
end;
run;
%macro compute_proportions(array=, prefix=);
_lt = 0; %* <0 count;
_eq = 0; %* =0 count;
_gt = 0; %* >0 count;
_n = 0;
do _index = 1 to dim(&array);
_v = &array(_n_);
if not missing(_v) then do;
_lt + _v < 0;
_eq + _v = 0;
_gt + _v > 0;
_n + 1;
end;
end;
if _n > 0 then do;
&prefix.prop_lt0 = _lt / _n;
&prefix.prop_eq0 = _eq / _n;
&prefix.prop_gt0 = _gt / _n;
end;
drop _lt _eq _gt _index _v _n;
%mend;
data want;
set have;
array a a_:; * all variables whose names start with a_ can be array referenced during step;
array b b_:;
array c c_:;
%compute_proportions (array=a, prefix=a_)
%compute_proportions (array=b, prefix=b_)
%compute_proportions (array=c, prefix=c_)
run;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.