SAS преобразовывает вертикальные данные с датами в горизонтальные данные - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь преобразовать следующую базовую таблицу в другую таблицу. Таблица имеет дату и элемент значения.

    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 tabulate и т. д. Если есть код, который может сделать это простым способом, пожалуйста, дайте мне знать.

спасибо!

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Преобразование набора данных из категорийных значений данных (столбец даты) в набор данных с такими же значениями, как у метаданных (имена столбцов по одному в год), может быть проблематичным для дополнительной последующей обработки.

Обычное потреблениесоздать отчет в многомерной форме и оставить все как есть.

Например:

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

Создать отчет

The *Процедура 1012 * нуждается в отдельной переменной для каждого размерного использования (указывается с помощью оператора 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 Процедура также потребовала бы, чтобы входящие данные имели значение даты в двух формах - первая как месяц (для обработки BY, которая становится строкой 'id', и вторая как год, который становится именем столбца с помощью оператора ID.

proc sql;
  create view have_sorted_by_month_year as
  select 
    put(date,monname3.) as month_name,
    year(date) as year,
    percent 
  from have
  order by month(date), year(date);
quit;

proc transpose data=have_sorted_by_month_year out=want(drop=_name_);
  by month_name notsorted;
  var percent;
  id year;
run;

proc print data=want;
run;

----------------------------------

       month_
Obs     name        _2015       _2016       _2017       _2018       _2019

  1     Jan      0.201501    0.201601    0.201701    0.201801    0.201901
  2     Feb      0.201502    0.201602    0.201702    0.201802    0.201902
  3     Mar      0.201503    0.201603    0.201703    0.201803    0.201903
  4     Apr      0.201504    0.201604    0.201704    0.201804    0.201904
  5     May      0.201505    0.201605    0.201705    0.201805    0.201905
  6     Jun      0.201506    0.201606    0.201706    0.201806    0.201906
  7     Jul      0.201507    0.201607    0.201707    0.201807    0.201907
  8     Aug      0.201508    0.201608    0.201708    0.201808    0.201908
  9     Sep      0.201509    0.201609    0.201709    0.201809    0.201909
 10     Oct      0.201510    0.201610    0.201710    0.201810    0.201910
 11     Nov      0.201511    0.201611    0.201711    0.201811    0.201911
 12     Dec      0.201512    0.201612    0.201712    0.201812    0.201912
0 голосов
/ 07 ноября 2019
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

...