有什么方法可以告诉 SAS 对于任何对象 ####1、####2 或 ####3(其中 # = 1-9),我希望它们的格式为 #### Spring、#### 秋天和#### 冬天?

Is there some way to tell SAS that for any obs ####1, ####2, or ####3 (where # = 1-9), I want them formatted #### Spring, #### Fall, and #### Winter?

所以我对一个变量进行了 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、和 #### Winter(这将是 value 语句下的三行)?

在此先感谢您的帮助。

由于您仅在最后一位数字上应用格式,因此不需要使用 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. 连接 2 和 3 的输出

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

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

data forfmt;
  fmtname='SEASONF';
  length start  label ;
  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;