我对使用 R 进行编程相当得心应手,但我正在从事一项学术统计分析,而我的 PI 更希望在 SAS 中完成这项工作。我正在使用 SAS University Edition,因此无法使用新的提交/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 中的数据步、PROC SQL 或其他方式中是否有更简单的方法来执行此操作?预先感谢您的帮助。
最佳答案
首先:在使用 SAS 与 R 时,您会发现在其中一个比另一个更容易做的事情。由于 R 是一种矩阵语言,而 Base SAS 不是,因此“扫描此列表中的每个元素......”之类的事情将是 R 比 SAS 更有效的事情之一。
也就是说,有一种简单的方法可以做到这一点:
data want;
set example;
num_h = lengthn(trimn(compress(cats(of _character_),'H','k')));
run;
COMPRESS 消除了不是 'H' 的字符,然后其他东西使它正常工作(trimn/lengthn 使它不把空的 ' ' 算作一个,cats 获取所有 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;
当然要写的时间长一点,但很容易完成工作。
关于sas - 在 SAS 中有条件地计算跨多个变量的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34665424/