SAS - 定义字母数组

时间:2017-07-20 15:01:18

标签: sas

SAS中是否有速记来定义数组中的字母序列?

许多语言都拥有轻松实现这一目标的机制,我想SAS也是如此,尽管我无法找到它的参考。

例如,在R中,我可以做到

> x <- letters[1:4]
> x
[1] "a" "b" "c" "d"

在Python中,一种方法是

>>> import string
>>> list(string.ascii_lowercase[:4])
['a', 'b', 'c', 'd']

在SAS中,我目前必须明确列出这些字母,

data _null_;
  array letters (4) $ _temporary_ ('a', 'b', 'c', 'd');
  do i = 1 to hbound(letters);
    put letters(i);
  end;
run;

4 个答案:

答案 0 :(得分:4)

并非我意识到这一点,但写一个宏来做这件事是微不足道的。

Condition

答案 1 :(得分:2)

另一种选择是使用collate函数和call pokelong例程:

/*Upper case*/
data _null_;
  array a[26] $1;
  call pokelong(collate(65,65+25),addrlong(a1),26);
  put _All_;
run;

/*Lower case*/
data _null_;
  array a[26] $1;
  call pokelong(collate(97,97+25),addrlong(a1),26);
  put _All_;
run;

这绕过了为单个变量赋值的所有常用机制,并利用了SAS用于字符数组的默认内存布局,从第一个元素的地址开始一次性复制整个字母。

N.B。某些锁定的SAS环境中可能无法使用call pokelong,例如SAS大学版。此外,对于某些平台上的SAS 9.1.3或更早版本中的临时阵列,这可能无法正常工作。

我认为这是在SAS中执行此操作的唯一方法,无需对字母进行硬编码或编写某种循环。

答案 2 :(得分:2)

您可以使用COLLATE()生成一串单字节字符。如果您不知道所需字符块开头的ASCII代码,请使用RANK()函数。

所以,如果你只想从'a'开始四个字符,你就可以这样做。

  length str $4 ;
  str = collate(rank('a'));

或者您也可以使用可选的第二个参数COLLATE()来指定您想要的字符数。

  length str $4 ;
  str = collate(rank('a'),rank('a')+vlength(str)-1);

不需要“数组”,只需使用变量。

data _null_;
  length str $4 ;
  str = collate(rank('a'));
  do i=1 to vlength(str);
    ch = char(str,i);
    put i= ch= :$quote. ;
  end;
run;

结果:

i=1 ch="a"
i=2 ch="b"
i=3 ch="c"
i=4 ch="d"

答案 3 :(得分:0)

您可以使用rank函数(将字符转换为其ascii值)和byte函数(以其他方式转换回来)的组合。

data _null_;
length seq $51; /* define seq as character variable */
do i = rank('a') to rank('d'); /* loop through ascii values of required letters */
call catx(' ',seq,byte(i)); /* concatenate letters */
end;
put seq; /* print final output */
run;