добавить новый столбец на основе других столбцов в sas - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в SAS и хотел бы получить помощь по следующему вопросу:

1: Пример таблицы показан ниже

Time Color Food label
2020 red  Apple A
2019 red Orange A,B
2018 blue Apple A,B
2017 blue  Orange B  

Logi c для возврата метки:

when color = 'red' then 'A'
when color = 'blue' then 'B'
when food = 'orange' then 'B'
when food = 'apple' then 'A',

поскольку для строки 2 у нас есть и красный, и оранжевый, тогда наша метка должна содержать оба 'A, B ', то же, что и в строке 3.

Требуется распечатать этикетку для каждой комбинации. Я знаю, что мы можем использовать оператор CASE WHEN, чтобы определить, как наша этикетка должна основываться на цвете и еде. Здесь у нас есть только 2 вида цветов и 2 разных блюда, но что, если нам нравятся 7 разных цветов и 10 разных блюд, тогда у нас будет 7 * 10 различных комбинаций. Я не хочу перечислять все эти комбинации, используя оператор case when.

Есть ли удобный способ вернуть метку? Спасибо за любые идеи! (Предпочитаю реализовать это в PRO C SQL, но SAS также приветствуется)

1 Ответ

3 голосов
/ 10 июля 2020

Это похоже на простое применение форматов. Итак, определите формат, который преобразует COLOR в кодовую букву, и второй, который преобразует FOOD в кодовую букву.

proc format ;
   value color 'red'='A' 'blue'='B';
   value food 'Apple'='A' 'Orange'='B' ;
run;

Затем используйте их для преобразования фактических значений переменных COLOR и FOOD в метки. Либо на шаге данных:

data want;
   set have ;
   length label $5 ;
   label=catx(',',put(color,color.),put(food,food.));
run;

Или SQL запрос:

proc sql ;
create table want as 
  select *
       , catx(',',put(color,color.),put(food,food.)) as label length=5
  from have
;
run;

Вам не нужно воссоздавать формат, если данные изменяются, только если список возможных изменений значений.

...