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

SAS-如何确定使用范围内的变量数量?,sas,Sas,我想我问的是非常基本的问题,但我不完全确定如何在SAS中做到这一点 假设我有一个变量范围,或者一个数组,x1xn。我希望能够运行一个程序,使用该范围内的变量数量作为计算的一部分。但是我想这样写,如果我把变量添加到这个范围,它仍然可以工作 data _null_; x3='ABC'; array _temp x1-x7; count = dim(_temp); put count=; run; 本质上,我希望能够创建一个变量,如果我有x1-x6,变量值是“6”,但是如果我有x1-

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

假设我有一个变量范围,或者一个数组,x1xn。我希望能够运行一个程序,使用该范围内的变量数量作为计算的一部分。但是我想这样写,如果我把变量添加到这个范围,它仍然可以工作

data _null_;
  x3='ABC';
  array _temp x1-x7;
  count = dim(_temp);
  put count=;
run;
本质上,我希望能够创建一个变量,如果我有x1-x6,变量值是“6”,但是如果我有x1-x7,值是“7”

我知道:

var1=n(of x1-x6)
将返回未丢失的数值变量的数量。。但如果缺少值,我希望它能起作用

我希望我能清楚地解释这一点,并且它是有意义的。

两件事

首先,当你像以前一样放一个靶场时:

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个“单词”

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


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

COUNTW(CATX())技巧不适用于空字符变量。尝试将其调整为
count=countw(catx('|',对于x1--x7),'|')+cmiss(''',对于x1-character-x7)-1
以修复嵌入分隔符的处理方法调整CATQ和countw函数上的修饰符
countw(catq('dmas','|',x1--x7),'|','mq')
Yeah,我还是加上这一点吧,反正我换成了catq。CATQ不需要任何其他参数,只需将“q”添加到COUNTW即可。CATQ总是引用带有嵌入分隔符的内容。顺便说一句,如果这是一件琐碎的事情,并且不改变总体答案(如果您愿意),您总是欢迎直接添加这些内容。