SAS将带有日期的垂直数据转换为水平数据

时间:2019-11-05 22:08:19

标签: sas

我正在尝试将以下基本表转换为另一个表。该表具有日期和值元素。

    Date Percent
201801  0.09
201802  0.04
201803  0.09
201804  0.06
201805  0.09
201806  0.07
201807  0.07
201808  0.01
201809  0.1
201810  0.03
201811  0.08
201812  0.01
201901  0.08
201902  0.06
201903  0.1
201904  0.1
201905  0.02
201906  0.1
201907  0.01
201908  0.03
201909  0.06
201910  0.08

到以下:

    2018    2019
Jan 0.09    0.08
Feb 0.04    0.06
Mar 0.09    0.1
Apr 0.06    0.1
May 0.09    0.02
Jun 0.07    0.1
Jul 0.07    0.01
Aug 0.01    0.03
Sep 0.1     0.06
Oct 0.03    0.08
Nov 0.08    
Dec 0.01    

是否有可以轻松实现的程序?例如proc制表等。如果有可以简单方式实现的代码,请告诉我。

谢谢!

2 个答案:

答案 0 :(得分:2)

将具有分类数据值(日期列)的数据集转换为与元数据具有相同值的数据集(每年列名称为一个)对于附加的下游处理可能会遇到问题。

通常的做法是创建一个多维形式的报告并将其保留。

例如:

data have (label="5 years of monthly values");
  do date = '01jan2015'd to '31dec2019'd;
    date = intnx ('month', date, 0, 'E');
    percent = (year(date) + month(date) / 100) / 1e4;
    output;
  end;

  format date yymmd8.;
  format percent 8.6;
run;

ods listing;
options pagesize=21 nocenter nodate nonumber; title; 
proc report data=have panels=3;
  columns date percent;
  define percent / display;
run;
------------------------- output -------------------------
    date   percent          date   percent          date   percent
 2015-01  0.201501       2016-09  0.201609       2018-05  0.201805
 2015-02  0.201502       2016-10  0.201610       2018-06  0.201806
 2015-03  0.201503       2016-11  0.201611       2018-07  0.201807
 2015-04  0.201504       2016-12  0.201612       2018-08  0.201808
 2015-05  0.201505       2017-01  0.201701       2018-09  0.201809
 2015-06  0.201506       2017-02  0.201702       2018-10  0.201810
 2015-07  0.201507       2017-03  0.201703       2018-11  0.201811
 2015-08  0.201508       2017-04  0.201704       2018-12  0.201812
 2015-09  0.201509       2017-05  0.201705       2019-01  0.201901
 2015-10  0.201510       2017-06  0.201706       2019-02  0.201902
 2015-11  0.201511       2017-07  0.201707       2019-03  0.201903
 2015-12  0.201512       2017-08  0.201708       2019-04  0.201904
 2016-01  0.201601       2017-09  0.201709       2019-05  0.201905
 2016-02  0.201602       2017-10  0.201710       2019-06  0.201906
 2016-03  0.201603       2017-11  0.201711       2019-07  0.201907
 2016-04  0.201604       2017-12  0.201712       2019-08  0.201908
 2016-05  0.201605       2018-01  0.201801       2019-09  0.201909
 2016-06  0.201606       2018-02  0.201802       2019-10  0.201910
 2016-07  0.201607       2018-03  0.201803       2019-11  0.201911
 2016-08  0.201608       2018-04  0.201804       2019-12  0.201912

创建报告

TABULATE过程对于每个维度用途都需要一个单独的变量(由CLASS语句指定)。由于相同的日期值会影响跨维度和向下维度,因此需要重复日期值。可以使用数据集视图来完成此操作,因此不需要将原始数据复制到新数据集中。

类变量的格式化值在列表呈现中使用。

data have2 / view=have2;
  set have;
  date2 = date;
run;

proc tabulate data=have2;
  class date date2;
  format date monname3.;
  format date2 year.;
  var percent;
  table date='', date2='' * percent='' * sum='' * f=8.6;
run;

enter image description here

数据转换

如果您仍然需要包含year列的实际数据集,则TRANSPOSE过程还将要求传入数据的日期值有两种形式-第一种是月份(对于{{1} }通过BY语句处理,成为行“ id”,第二个作为年份,成为列名。

ID

答案 1 :(得分:0)

DATA TEST;
   INPUT Date $ Percent;
   DATE1=COMPRESS(DATE||'01');
   DATEN=INPUT(DATE1,YYMMDD8.);
   FORMAT DATEN DATE9.;
   YEAR = YEAR(DATEN);
   MONTH = PUT(DATEN, MONNAME3.);
   DATALINES;
201801  0.09
201802  0.04
201803  0.09
201804  0.06
201805  0.09
201806  0.07
201807  0.07
201808  0.01
201809  0.1
201810  0.03
201811  0.08
201812  0.01
201901  0.08
201902  0.06
201903  0.1
201904  0.1
201905  0.02
201906  0.1
201907  0.01
201908  0.03
201909  0.06
201910  0.08
;
RUN;

PROC SORT DATA=TEST;BY MONTH;
PROC TRANSPOSE DATA=TEST OUT=TESTT(DROP=_NAME_);
   BY MONTH;
   ID YEAR;
   VAR PERCENT;
RUN;

PROC PRINT DATA=TESTT NOOBS; RUN;

enter image description here