我正在尝试将以下基本表转换为另一个表。该表具有日期和值元素。
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制表等。如果有可以简单方式实现的代码,请告诉我。
谢谢!
答案 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;
数据转换
如果您仍然需要包含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;