Объединить три набора данных 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,

Другие вопросы по тегам