SAS如何根据一列中的信息动态格式化数组

SAS如何根据一列中的信息动态格式化数组,sas,Sas,我是SAS的新手,非常感谢任何能帮助我制定代码的人。有人能帮我根据第一列值更改数组的格式吗 基本上这是原始数据: Category Name1 Name2......... (Changes invariably) #ofpeople 20 30 #ofproviders 10 5 #ofclaims 40 25 AmountBilled 50 100 AmountPaid 11

我是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下的值格式化为infinite Name,并将它们重新格式化为dollar10.2,用于“AmountBilled”、“AmountPaid”、“amounted”类别下的任何值


非常感谢你的帮助

您不能像在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转置之前,是这样开始的吗?并将字符变量放置在不需要数组的位置。对我来说,这是最干净的选择

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

非常感谢!我试试看。