Преобразование строк, содержащих годы, в столбцы - PullRequest
2 голосов
/ 18 ноября 2010

Для ввода данных в SAS требуется следующий формат:

Country Year Indicator_1
Belgium 1900 x1
Belgium 1901 x2
...
Belarus 1901 x1

Однако большинство моих данных поступают в следующем формате:

Country 1900 1901 1902 ... etc
Belgium x1____x2___x3  ...etc
Belarus x1____x2___x3  ...etc

Есть ли простой макрос или скрипт VBA, который может помочь?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

разбить строку индикатора на переменные года

при условии, что данные будут храниться более 3 лет, вам необходимо настроить формат и массив, ссылаясь на Y1900-Y1902.

data original;
    infile datalines;
    format Country $20. YearIndicator $50.;
    input Country YearIndicator;

    format Y1900-Y1902 $4.;
    array y(*) y1900-y1902;
    do i = 1 to dim(y);
        y[i] = scan(YearIndicator,i,'_');
    end;
    drop i;
datalines;
Belgium x1____x2___x3
Belarus x1____x2___x3
run;

сделать широкий стол высотой

proc transpose data=original out=talldata(rename=(_NAME_=CYear COL1=Indicator));
    by country notsorted;
    var y1900-y1902;
run;

сделать переменную года числовым, а не символьным

data talldata;
    format Country $20. Year 4. Indicator $4.;
    set talldata;
    year=input(compress(cyear,,'kd'),4.);
    drop cyear;
run;

просмотр результатов

proc print data=talldata; run;

выход

Obs    Country                 Year    Indicator

 1     Belgium                 1900      x1
 2     Belgium                 1901      x2
 3     Belgium                 1902      x3
 4     Belarus                 1900      x1
 5     Belarus                 1901      x2
 6     Belarus                 1902      x3
1 голос
/ 18 ноября 2010

Вы можете использовать запрос Union:

SELECT Country, 1900 As SYear, [1900] As Indicator FROM Table
UNION ALL
SELECT Country, 1901 As SYear, [1901] As Indicator FROM Table

<..>

UNION ALL
SELECT Country, 2010 As SYear, [2010] As Indicator FROM Table

Это можно использовать для создания таблицы, если невозможно экспортировать запрос.

0 голосов
/ 02 декабря 2010

Если исходные необработанные данные достаточно регулярны, то это можно сделать очень просто с помощью простого шага данных, как показано ниже.

   data one;
     infile cards dlm=" _" missover;
     input country :$20. @;
     do year = 1900 to 1902;
       input indicator $ @;
       output;
     end;
   cards;
   Belgium x1____x2___x3
   Belarus x4____x5___x6
   ;
   run;

   /* check */
   proc print data=one;
   run;
   /* on lst
   Obs    country    year    indicator
    1     Belgium    1900       x1
    2     Belgium    1901       x2
    3     Belgium    1902       x3
    4     Belarus    1900       x4
    5     Belarus    1901       x5
    6     Belarus    1902       x6
   */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...