#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;