Переместить несколько столбцов из строки в новую строку - PullRequest
0 голосов
/ 07 мая 2020

Я уже ознакомился с некоторыми подходами к этой проблеме, но до сих пор не мог дать никаких результатов самостоятельно, вероятно, потому что я новичок в этом инструменте, поэтому прошу помощи с помощью SAS Enterprise Guide 8.1.

Есть:

DATE     |COD|TOTAL |P1_DX    |P1_DY    |P1_CD|P2_DX    |P2_DY    |P2_CD| ...until P8_
01JAN2004|9  |185   |02FEB2005|27SEP2010|36   |10SEP2011|12DEC2020|16   |  
31JAN2010|2  |351   |17FEB2015|27DEC2020|2    |         |         |     |  
(...)

Хочу

DATE      |COD|TOTAL |DX       |DY       |CD |
01JAN2004 |9  |185   |02FEB2005|27SEP2010|36 |
01JAN2004 |9  |185   |10SEP2011|12DEC2020|16 |
31JAN2010 |2  |351   |17FEB2015|27DEC2020|2  |
(...)

1 Ответ

0 голосов
/ 07 мая 2020

Вы переворачиваете (также называете это транспонированием) данные в нескольких наборах столбцов.

Кодеры обычно используют PROC TRANSPOSE для сводки данных, но специфика этого вопроса не может быть решена за один шаг pro c.

Вместо выполнения шагов TRANSPOSE / DATA / TRANSPOSE или TRANSPOSE / TRANSPOSE / TRANSPOSE / MERGE, один шаг DATA с ARRAY может быть закодирован для выполнения поворота.

Пример:

ПРИМЕЧАНИЕ: ваше соглашение об именах столбцов P<#>_DX, P<#>_DY и P<#>_CD означает, что элементы ARRAY должны быть явно перечислены. Если вместо этого имена столбцов были построены с использованием соглашения DX_<#>, столбцы можно было бы указать в синтаксисе списка нумерованных суффиксов DX_1-DX_8

data want;
  set have;
  array DXs(8) P1_DX P2_DX ...you fill in the rest... P8_DX;
  array DYs(8) P1_DY P2_DY ...you fill in the rest... P8_DY;
  array CDs(8) P1_CD P2_CD ...you fill in the rest... P8_CD;

  length DX DY CD 8;

  do seq = 1 to dim(DXs);
    DX = DXs(seq);
    DY = DYs(seq);
    CD = CDs(seq);

    * only output if there is some data;
    if NMISS(DX,DY,CD) < 3 then OUTPUT;
  end;

  * seq is also kept in case you need to know which <#> a DX DY CD came from;
  keep DATE COD TOTAL DX DY CD seq;
run;
...