sas - 在 SAS 中有条件地计算跨多个变量的响应

标签 sas

我对使用 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/

相关文章:

sas - 删除库中的所有数据集

sas - 从 EG(元数据)获取 SAS VA Report 创建者的姓名

hash - SAS MD5 哈希

sql - 使用 SAS 或 SQL 查找一行中的第一个和最后一个非空值?

cmd - 输出以记录 SAS 中 CMD 的输出?

sas - 如何更改SAS数据集成中列中的数据?

宏变量的 SAS 选项值

sas - 数据 _null_ 的调用符号的差异

machine-learning - SAS : how to get the neighbor list for each row? 中的 k 最近邻

sas - SAS spds 簇表上的 Ixutil 命令