我想我所问的是非常基本的,但我并不完全确定如何在SAS中做到这一点。
让我们说我有一系列变量或数组x1-xn。我希望能够运行一个程序,该程序使用该范围内的变量数作为其计算的一部分。但我想以这样的方式编写它,如果我将变量添加到该范围,它仍将起作用。
基本上,我希望能够创建一个变量,如果我有x1-x6,变量值为' 6',但如果我有x1-x7,则值为' 7&#39 ;.
我知道:
var1=n(of x1-x6)
将返回非缺失数字变量的数量..但是如果缺少值,我希望它能够正常工作。
我希望我能清楚地解释这一点并且这是有道理的。
答案 0 :(得分:2)
一些事情。
首先,当你像你一样放置一个范围时:
x1-x7
无论这些变量是否存在,总是评估为七个项目。这简单地评估为
x1 x2 x3 x4 x5 x6 x7
因此询问有多少项目并不是很有趣,除非您通过宏生成该项目(如果您是,您可能可以让该宏指示有多少项目在它)。
但范围x1--x7
或x:
都是更有趣的问题,所以我们会继续。
最简单的方法是,如果变量都是单一类型(但是未知类型),则创建一个数组,然后使用dim
函数
data _null_;
x3='ABC';
array _temp x1-x7;
count = dim(_temp);
put count=;
run;
但是,如果手头有多种类型(数字和字符),那是行不通的。如果有,那么你需要做一些更复杂的事情。
下一个最简单的解决方案是合并nmiss
和n
。如果它们全部为数字,或者如果您能够容忍将创建的日志消息,则此方法有效。
data _null_;
x3='ABC';
count = nmiss(of x1-x7) + n(of x1-x7);
put count=;
run;
nmiss
是丢失的数量,加上n
是非缺失数字的数量。此处x3
与nmiss
组一起计算。
不幸的是,c
版本没有n
,或者我们可以更轻松地完成此操作(合并c
和cmiss
)。您可以在宏功能中执行此操作,但这会有点混乱。
幸运的是,有第三个选项可以容忍字符变量:将countw
与catx
结合起来。然后:
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,但是您丢失了修饰符,这意味着您在使用空字符串和嵌入分隔符时会遇到更多麻烦。