Объединить три набора данных SAS по горизонтали с переименованием столбцов
Я работаю в руководстве SAS Enterprise и хочу объединить три отдельных набора данных в один набор данных. Все наборы данных имеют один столбец с одинаковой длиной, типом данных и заголовком столбца:
Мои данные выглядят следующим образом (три таблицы, по 1 столбцу каждая):
data1 data2 data3
apples apples apples
100 200 300
55 77 80
3422 32432 1234
Я хочу, чтобы мои выходные данные выглядели следующим образом (одна таблица, 3 столбца). Заголовки столбцов должны быть изменены на имя по моему выбору:
output_data
green_apples red_apples yellow_apples
100 200 300
55 77 80
3422 32432 1234
Я возился с инструкциями слияния SAS и proc_sql, но из того, что я видел, мне всегда нужно добавлять какой-то общий идентификатор (для операторов BY или чего-то подобного).
Есть ли быстрый способ сделать то, что я хочу?
Спасибо заранее за помощь.
2 ответа
data want;
merge a(rename=apples=green_apples)
b(rename=apples=red_apples)
c(rename=apples=yellow_apples)
;
run;
Это будет делать, как вы говорите, объединить наборы данных без by
заявление. Есть вариант (options mergenoby=ERROR|WARN|NOWARN
), который, возможно, сделает это утверждение ошибочным или выдаст предупреждение (так как это часто делается по ошибке), но вы можете включить его в NOWARN
чтобы избежать этого.
Нет хорошего способа сделать это в SQL без создания искусственного идентификатора строки.
Одно быстрое и грязное решение, которое точно соответствует тому, что вы опубликовали:
data output_data;
set data1 (rename=(apples = green_apples));
set data2 (rename=(apples = red_apples));
set data3 (rename=(apples = yellow_apples));
run;
Имейте в виду, что это решение будет ограничено количеством наблюдений в наименьшем наборе данных.
Тем не менее, похоже, что вы хотите сопоставить записи в порядке их появления в наборах данных? В таком случае было бы полезно поле идентификатора, описывающее порядок (например, если наборы данных имели различное количество наблюдений). Один из способов сделать это - использовать _N_
автоматическая переменная:
/*
Changing observation counts
*/
data data1;
id = _N_;
input apples 8.;
cards;
100
55
3422
;
run;
data data2;
id = _N_;
input apples 8.;
cards;
200
77
32432
1
2
;
run;
data data3;
id = _N_;
input apples 8.;
cards;
300
80
1234
5
;
run;
data output_data;
merge data1 (in=d1 rename=(apples = green_apples))
data2 (in=d2 rename=(apples = red_apples))
data3 (in=d3 rename=(apples = yellow_apples));
by id;
if d1 or d2 or d3;
run;
Здесь опция набора данных (in=d1...
создает временную переменную d1
и устанавливает его 1
если запись из data1
соответствует записи из любого data2
или же data3
от id
,