Объединение SAS в шаге данных SAS - PullRequest
0 голосов
/ 26 апреля 2018

Я не знаю, как описать этот вопрос, но вот пример. У меня есть начальный набор данных выглядит так:

input  first second $3.;
cards;
1 A
1 B
1 C
1 D
2 E
2 F
3 S
3 A
4 C
5 Y
6 II
6 UU
6 OO
6 N
7 G
7 H
...
;

Мне нужен выходной набор данных, подобный этому:

input  first second $;
cards;
1 "A,B,C,D"
2 "E,F"
3 "S,A"
4 "C"
5 "Y"
6 "II,UU,OO,N"
7 "G,H"
...
;

Обе таблицы будут иметь два столбца. Уникальное значение диапазона столбца «первый» может быть от 1 до любого числа.

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Для этого можно использовать обработку по группам и функцию сохранения.

Создание образца набора данных:

data have;
input id value $3.;
cards;
1 A
1 B
1 C
1 D
2 E
2 F
3 S
3 A
4 C
5 Y
6 II
6 UU
6 OO
6 N
7 G
7 H
;
run;

Сначала убедитесь, что ваш набор данных отсортирован по переменной id:

proc sort data=have;
  by id;
run;

Затем используйте обозначения first. и last., чтобы определить, когда переменная id изменяется или собирается измениться. Оператор retain указывает шагу данных сохранять значение в пределах concatenated_value над наблюдениями, а не сбрасывать его в пустое значение. Используйте функцию quote(), чтобы применить символы " вокруг результата перед выводом записи. Используйте функцию cats() для выполнения фактической конкатенации и разделения записей с помощью ,.

data want;
  length contatenated_value $500.;
  set have;
  by id;
  retain contatenated_value ;

  if first.id then do;
    contatenated_value = '';
  end;

  contatenated_value = catx(',', contatenated_value, value);

  if last.id then do;
    contatenated_value = quote(cats(contatenated_value));
    output;
  end;

  drop value;
run;

Выход:

contatenated_
    value        id

"A,B,C,D"         1
"E,F"             2
"S,A"             3
"C"               4
"Y"               5
"II,UU,OO,N"      6
"G,H"             7
0 голосов
/ 27 апреля 2018

что-то вроде ниже

 proc sort data=have;
 by first second;
 run;
data want(rename=(b=second));
 length new_second $50.;
do until(last.first);
set have;
by first second ;
new_second =catx(',', new_second, second);
b=quote(strip(new_second));
end;
drop second new_second;
run;

вывод

 first  second
 1         "A,B,C,D"
 2         "E,F"
 3          "A,S"
 4           "C"
 5          "Y"
 6         "II,N,OO,UU"
 7         "G,H"
...