SAS - 如何确定使用范围内的变量数量?

时间:2017-03-01 16:55:25

标签: sas

我想我所问的是非常基本的,但我并不完全确定如何在SAS中做到这一点。

让我们说我有一系列变量或数组x1-xn。我希望能够运行一个程序,该程序使用该范围内的变量数作为其计算的一部分。但我想以这样的方式编写它,如果我将变量添加到该范围,它仍将起作用。

基本上,我希望能够创建一个变量,如果我有x1-x6,变量值为' 6',但如果我有x1-x7,则值为' 7&#39 ;.

我知道:

var1=n(of x1-x6)

将返回非缺失数字变量的数量..但是如果缺少值,我希望它能够正常工作。

我希望我能清楚地解释这一点并且这是有道理的。

1 个答案:

答案 0 :(得分:2)

一些事情。

首先,当你像你一样放置一个范围时:

x1-x7

无论这些变量是否存在,总是评估为七个项目。这简单地评估为

x1 x2 x3 x4 x5 x6 x7

因此询问有多少项目并不是很有趣,除非您通过宏生成该项目(如果您是,您可能可以让该宏指示有多少项目在它)。

但范围x1--x7x:都是更有趣的问题,所以我们会继续。

最简单的方法是,如果变量都是单一类型(但是未知类型),则创建一个数组,然后使用dim函数

data _null_;
  x3='ABC';
  array _temp x1-x7;
  count = dim(_temp);
  put count=;
run;

但是,如果手头有多种类型(数字和字符),那是行不通的。如果有,那么你需要做一些更复杂的事情。

下一个最简单的解决方案是合并nmissn。如果它们全部为数字,或者如果您能够容忍将创建的日志消息,则此方法有效。

data _null_;
  x3='ABC';
  count = nmiss(of x1-x7) + n(of x1-x7);
  put count=;
run;

nmiss是丢失的数量,加上n是非缺失数字的数量。此处x3nmiss组一起计算。

不幸的是,c版本没有n,或者我们可以更轻松地完成此操作(合并ccmiss)。您可以在宏功能中执行此操作,但这会有点混乱。

幸运的是,有第三个选项可以容忍字符变量:将countwcatx结合起来。然后:

data _null_;
  x3='ABC';
  x4=' ';
  count = countw(catq('dm','|',of x1-x7),'|','q');
  put count=;
run;

这将计算所有变量,数字或字符,没有转换注释。

你在这里做的是将所有变量与一个分隔符连接在一起,所以[x1]|[x2]|[x3]...,然后计算"单词的数量"在该字符串中定义单词为" |"分隔的内容。即使缺少价值也会创造一些东西 - 所以.|.|ABC|.|.|.|.会有7"单词"。

' m' CATQ的参数告诉它甚至在连接中包含缺失值(空格)。 ' q' COUNTW的参数告诉它忽略引号内的分隔符(CATQ默认添加)。

如果您在CATQ可用之前使用过某个版本(我相信在9.2中添加了它),那么您可以使用CATX,但是您丢失了修饰符,这意味着您在使用空字符串和嵌入分隔符时会遇到更多麻烦。