有没有办法告诉SAS对于任何障碍#### 1,#### 2或#### 3(其中#= 1-9),我希望它们格式化#### Spring,## ##秋天,####冬天?

时间:2015-02-18 04:26:24

标签: formatting sas

所以我对一个看起来像这样的变量有1000个观察结果:

19962
19943
19972
19951
19951
19912

前四位数字略有不同,但最后一位数字总是1,2或3.有没有办法只格式化最后一位数字,而不必输入前四位数字的每次迭代value声明?

也就是说,我想避免这样做:

proc format;
value varfmt 
  19911 = '1991 Spring'
  19912 = '1991 Fall'
  19913 = '1991 Winter'
  19921 = '
  19922 = '
  […]
  19991 = '1999 Spring'
  19992 = '1999 Fall'
  19993 = '
  ;
run;

相反,有没有办法告诉SAS,对于任何####1####2####3,我都需要#### Spring#### Fall和{ {1}}(#### Winter语句下会有三行?)

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

由于您仅在最后一位数字上应用格式,因此不需要使用proc格式中的所有数字。只需提取最后一位数字并在其上应用格式并将其与其他前四位数字连接。

创建样本数据集

data test;
infile datalines;
input year;
datalines;
19962
19943
19972
19951
19951
19912
;
run;

创建格式

proc format;
value $varfmt
1 = 'Spring'
2 = 'Fall'
3 = 'Winter'
;
run;

在这里,做以下事情

  1. 提取最后一位数字
  2. 在上面创建
  3. 上的格式
  4. 提取数字的前四位数
  5. 连接2和3的输出

  6. data final;
    set test;
    year_new = cat(substr(compress(year),1,4)," ",put(substr(compress(year),5,1),$varfmt.));
    run;
    

答案 1 :(得分:3)

如果您确实需要整个值的格式,您还可以选择从数据集创建格式。您将不得不创建所有可能的行,但这并不是特别困难。

data forfmt;
  fmtname='SEASONF';
  length start $5 label $8;
  do startyr = 1990 to 2015;
    start=cats(startyr,'1');
    label=catx(' ',startyr,'Spring');
    output;
    start=cats(startyr,'2');
    label=catx(' ',startyr,'Fall');
    output;
    start=cats(startyr,'3');
    label=catx(' ',startyr,'Winter');
    output;
  end;
run;

proc format cntlin=forfmt;
quit;