您不能有条件地格式化列(就像在 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,则可以使用计算块在报告输出中有条件地设置列的样式(格式)。