繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM