我很乐意在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或其他方面?提前感谢您的帮助。
答案 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