SAS: Как мне разделить запятыми и транспонировать? - PullRequest
0 голосов
/ 26 февраля 2019

Я использую SAS Enterprise Guide.У меня есть новый файл, и меня попросили сгенерировать вывод.Источник:

Name    feeder_in    feeder_out   NickName
ABBA    1,2          A,B           ABBA
POLA    1,2          C,D,E         CONS POLA

и вывод желания:

Name             feeder_final    
ABBA              1                
ABBA              2                 
ABBA              A
ABBA              B
POLA              1                 
POLA              2
CONS POLA         C
CONS POLA         D
CONS POLA         E

Я пытался справиться с этим, но совсем не повезло.Я пробовал

data test;
catequipment=catx(',',strip(feeder_in),strip(feeder_out));
    do i=1 to countw(catequipment,',');

catequipment=catx(',',strip(feeder_in),strip(feeder_out));
    do i=1 to countw(catequipment,',');
output;
end;

xequipment=newequipment;

run;

У кого-нибудь есть подсказки для этого?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

При транспонировании нескольких столбцов может потребоваться также сохранить исходные идентификаторы строк и столбцов для дальнейшей последующей аналитики.Последовательность значений в csv также может быть важна, если вам нужно выполнить парное соединение в позиции последовательности категориальной формы - например, необходимо сопоставить 1A 2B в строке 1 и 1C 2D в строке 2.

data have;
length name feeder_in feeder_out nickname $20;
input 
Name&   feeder_in&  feeder_out&  NickName&; datalines;
ABBA    1,2          A,B           ABBA
POLA    1,2          C,D,E         CONS POLA
run;

data want;
  _row_ + 1;

  set have;

  feeder = 'in ';
  do seq = 1 to countw(feeder_in,',');
    value = scan(feeder_in,seq,',');
    OUTPUT;
  end;

  feeder = 'out';
  do seq = 1 to countw(feeder_out,',');
    value = scan(feeder_out,seq,',');
    OUTPUT;
  end;

  keep _row_ Name feeder seq value NickName;
run;
0 голосов
/ 26 февраля 2019

Вот мое понимание ваших требований, основанное на желаемом выводе: вы хотите, чтобы ваш вывод имел одно наблюдение для каждой комбинации NAME и FEEDER_IN, плюс еще одно наблюдение для каждой комбинации NICKNAME и FEEDER_OUT.

Исходя из этого, код будет выглядеть примерно так (не проверено):

data want;

  set have;
  keep name feeder_final

  * Loop over FEEDER_IN and output one obs for each delimited value;
  do i = 1 to countw(feeder_in, ',');
    feeder_final = scan(feeder_in, i, ',');
    output;
  end;

  * Move the NICKNAME value into NAME;
  name = nickname;

  * Loop over FEEDER_OUT and output one obs for each delimited value;
  do i = 1 to countw(feeder_out, ',');
    feeder_final = scan(feeder_out, i, ',');
    output;
  end;

run;
...