有条件地计算SAS中多个变量的响应

时间:2016-01-07 21:23:17

标签: sas

我很乐意在R编程,但正在进行学术统计分析,我的PI更愿意在SAS中完成。我正在使用SAS大学版,因此不能使用新的提交/ R来做我在SAS中感到不舒服的事情。在任何情况下,我都试图有条件地计算多列中给定字符结果的频率。使用以下玩具数据集:

DATA example;
INPUT X01_d3 $ X02_d3 $ X03_d3 $ X04_d3 $;
CARDS;
H H F D
H H H H
H D D D
F F F D
F F D D
H . . .
H F . D
;
RUN; 

我想计算给定观察结果出现“H”的次数,并将其放入一个名为Num_H的新变量中。我通常在R中编写代码的方式是:

example$Num_H<-rowSums(example[,1:4] == "H")

给我以下输出:

> example
  X01_d3 X02_d3 X03_d3 X04_d3 Num_H
1      H      H      F      D     2
2      H      H      H      H     4
3      H      D      D      D     1
4      F      F      F      D     0
5      F      F      D      D     0
6      H      .      .      .     1
7      H      F      .      D     1

我可以使用if / then语句在数据步骤中轻松地编写它,但是基于我不希望的数据集的大小。是否有更简单的方法在SAS中执行此操作,在DATA步骤,PROC SQL或其他方面?提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

首先:在使用SAS vs R时,你会发现在一对一中比较容易做的事情。由于R是一种矩阵语言,而基本SAS不是,所以“扫描此列表中的每个元素......”将是R比SAS更有效的事情之一。

那说,有一种简单的方法可以做到这一点:

data want;
  set example;
  num_h = lengthn(trimn(compress(cats(of _character_),'H','k')));
run;

COMPRESS消除了不是'H'的字符,然后其他东西使得它正常工作(trimn / lengthn使得它不计算为空'',cat获取所有char变量并使它们成为一个单串)。

如果您的数据更复杂,您无法使用此技巧(例如多个字符串),您当然可以循环使用变量来获得结果。

data want;
  set example;
  array xvars x01_d3 -- x04_d3;
  do _i = 1 to dim(xvars);
    num_h = sum(num_h, xvars[_i]='H');
  end;
  drop _i;
run;

当然要写一点时间,但很容易完成工作。

答案 1 :(得分:2)

作为替代选项,如果您使用的是SAS University Edition,则可以访问SAS / IML,这是SAS的矩阵语言(即类似于R)。 IML与R不完全相同,你仍然会有一些问题无疑适应它,但它一种矩阵语言,所以你可能会发现这一点更容易。

这是IML程序,可以生成您要求的矢量。

proc iml;
  use work.example;
  read all var _CHAR_ into char_mat;
  for_num_h = countc('H',char_mat)[,+];
  print for_num_h;    
quit;

在这里,我应用SAS函数countc来生成1/0的矩阵(它在单元级别完成);然后使用subscript reduction operator for addition将它们加到矢量中。

答案 2 :(得分:1)

我会这样做:

   Data want;
    set example;
    Num_H = sum((X01_d3="H"), (X02_d3="H"),(X03_d3="H"),(X04_d3="H"));
   run; 

实际上(X01_d3 =&#34; H&#34;)创建一个虚拟变量0/1。所以你要做的就是总结这些价值!

希望它有所帮助!

MK