Замена нескольких строковых значений в SAS

#string #replace #sas #data-cleaning

#строка #заменить #sas #очистка данных

Вопрос:

У меня есть набор данных, который я пытаюсь очистить. Одной из переменных является пол, где у меня есть ‘F’, ‘Female, ‘M’, ‘Male’ и ‘Unknown’ в качестве значений. Я хочу изменить все итерации ‘F’, чтобы они отображались как ‘Женские’, и все значения ‘M’, чтобы они отображались как ‘Мужские’. У меня также есть другая переменная с именем ‘Ethnicity’, которая имеет такие значения, как ‘1 — White’, но я хочу, чтобы она отображалась как ‘White’.

Я пытался использовать tranwrd

 gender=tranwrd(gender, "F", "Female");
  

Но при этом значения ‘Female’ также заменяются на ‘Femaleemale’

Я также попытался индексировать:

 IF index(lowcase(gender),"f") THEN gender="Female";
IF index(lowcase(gender),"m") THEN gender="male";
  

Но несколько инструкций If не работают.

Комментарии:

1. Обязательно запустите Proc FREQ для своих данных, чтобы у вас был список всех дискретных значений и как часто они встречаются. Изменения, наблюдаемые в значениях bin, могут предлагать стратегии для работы с новыми данными или явный список для основы создания сопоставления исправлений.

Ответ №1:

Как вы обнаружили TRANWRD , это неправильная функция для текущей задачи преобразования значений. Ни то, ни другое не является, INDEX потому что истинное значение в SAS является ненулевым и не отсутствует — INDEX( source, excerpt ) результатом будет логическое значение true для случая нахождения excerpt где угодно в source .

Для конкретных преобразований значений используйте прямое буквальное значение для сравнения. Для тестирования определенного одиночного символа вы можете использовать нижний регистр, как показано, или использовать IN список.

   if gender in ('M', 'm') then gender = 'Male'; else
  if gender in ('F', 'f') then gender = 'Female';
  

В случае извлечения ethnicity из конструкции значения # - ethnicity вы можете, согласно @draycut, использовать COMPRESS функцию с опцией «Сохранить только буквенные символы» ( ka ).

Другой способ преобразовать шаблонные значения — использовать поиск по регулярному выражению и замену.

    * replace leading # - before embedded ethnicity with no string (//);
   ethnicity = prxchange ('/^d s*-s*//',1,ethnicity);
  

Ответ №2:

Посмотрите, можете ли вы использовать это в качестве шаблона

 data have;
input gender $ 1-7 Ethnicity $ 9-18;
datalines;
F       1 - White
Female  White    
Male    2 - Black
Unknown Black    
m       1 - White
f       1 - White
;

data want;
   set have;

   if upcase(char(gender, 1)) = "M" then gender = "Male";
   else if upcase(char(gender, 1)) = "F" then gender = "Female";
   else gender = "Unknown";

   Ethnicity = compress(Ethnicity, , 'ka');
run;