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;
答案 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;