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

时间:2013-09-13 19:35:29

标签: sas

我是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'的类别下的任何值。

非常感谢你的帮助!

1 个答案:

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