【问题标题】:Proportion of the variables in each observation that satisfy certain conditions in SAS每个观测值中满足 SAS 特定条件的变量的比例
【发布时间】:2020-03-30 16:42:15
【问题描述】:

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

请注意,例如 prsn1prop_b_gt0 是 0.6667,因为 prsn1 中的三个 b_ 变量中有两个em> 行的值大于 0。

我不确定如何系统地完成此任务。也许有一种方法可以将数组与 proc sql 步骤结合起来?欢迎任何解决方案!

【问题讨论】:

  • 为什么命名结构不一致? b_prop_gt0 将更符合现有的 b_dog b_cat b_mouse 变量。另外,您是说有大约 333 个响应主题(狗、猫、老鼠……第 333 个主题)?
  • 这也可以 - 如果这更容易,我会修改。是的,有大约 330 个主题。

标签: arrays sas data-cleaning proc-sql


【解决方案1】:

使用数组,您需要遍历数组并计算更大的数字(并可能计算非缺失的数字)。

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 变量的代码块。

【讨论】:

    【解决方案2】:

    对于超过三个数组(按变量名后缀 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多