我是SAS的新手,非常感谢任何可以帮助我制定代码的人。有人可以根据第一列值帮助我格式化更改数组吗?
所以基本上这里是原始数据:
Category Name1 Name2......... (Changes invariably)
#ofpeople 20 30
#ofproviders 10 5
#ofclaims 40 25
AmountBilled 50 100
AmountPaid 11 35
AmountDed 5 6
我想将Name1下的值格式化为无限Name#,并将其重新格式化为dollar10.2,以获取名为'AmountBilled','AmountPaid','AmountDed'的类别下的任何值。
非常感谢你的帮助!
答案 0 :(得分:0)
您无法有条件地格式化列(就像您可能在Excel中一样)。变量/列具有整个列的一种格式。有一些技巧可以解决这个问题,但它们总是比认为有用的更复杂。
您可以将格式化的值存储在字符变量中,但它会失去进行数学运算的能力。
data have;
input category :$10. name1 name2;
datalines;
#ofpeople 20 30
#ofproviders 10 5
#ofclaims 40 25
AmountBilled 50 100
AmountPaid 11 35
AmountDed 5 6
;;;;
run;
data want;
set have;
array names name:; *colon is wildcard (starts with);
array newnames $10 newname1-newname10; *Arbitrarily 10, can be whatever;
if substr(category,1,6)='Amount' then do;
do _t = 1 to dim(names);
newnames[_t] = put(names[_t],dollar10.2);
end;
end;
run;
您可以使用PROC CONTENTS或SQL的DICTIONARY.COLUMNS / SAS的SASHELP.VCOLUMN以编程方式找出newname1000端点。或者,您可以将原始数据集作为三列数据集放出,每个类别都有许多行(这是以PROC TRANSPOSE之前的方式开始的吗?)并将字符变量放在那里(不需要数组)。对我而言,这是最干净的选择。
data have_t;
set have;
array names name:;
format nameval $10.;
do namenum = 1 to dim(names);
if substr(category,1,6)='Amount' then nameval = put(names[namenum],dollar10.2 -l);
else nameval=put(names[namenum],10. -l); *left aligning here, change this if you want otherwise;
output; *now we have (namenum) rows per line. Test for missing(name) if you want only nonmissing rows output (if not every row has same number of names).
end;
run;
proc transpose data=have_t out=want_T(drop=_name_) prefix=name;
by category notsorted;
var nameval;
run;
最后,根据您实际使用做的内容,您可能在输出方法方面有更好的选择。例如,如果您正在进行PROC REPORT,则可以使用计算块在报告输出中有条件地设置列的样式(格式)。