SAS - Изменение существующих значений символьных переменных на числовые с использованием ввода - PullRequest
0 голосов
/ 01 ноября 2018

Имеет переменную с именем var1, которая имеет два вида значений (оба в виде символьных строк). Один - «ND», другой - число от 0 до 100 в виде строки. Я хочу преобразовать «ND» в 0 и строку символов в числовое значение, например, 1 (символ) в 1 (цифра).

Вот моя попытка кода:

data cleaned_up(drop = exam_1);
    set dataset.df(rename=(exam1=exam_1));
select (exam1);
    when ('ND') do;
        exam1 = 0;
    end;
    when ; 
        exam1 = input(exam_1,2.);
    end;
    otherwise;
end;

Очевидно, не работает. Что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Пара проблем с вашим кодом. Помещение оператора rename в качестве параметра набора данных для входного набора данных будет выполнять переименование до чтения данных. Следовательно, exam1 не будет существовать, поскольку теперь оно называется exam_1. Это все равно будет определяться как символьный столбец, поэтому функция input не будет работать.

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

Функция tranwrd заменит все вхождения от 'ND' до '0', затем, используя input с информатом best12, все данные будут считаны как числа. Вам не нужно указывать длину при чтении чисел (т. Е. 2. для 2 цифр, 3. для 3 цифр и т. Д.).

data cleaned_up (drop=exam1 rename=(exam_1=exam1));
set df;
exam_1 = input(tranwrd(exam1,'ND','0'),best12.);
run;
0 голосов
/ 01 ноября 2018

Попробуйте использовать функцию ifc, а затем преобразовать в числовую переменную.

data have;
input x $3.;
_x=input(ifc(x='ND','0',x),best12.);
cards;
3
10
ND
;
0 голосов
/ 01 ноября 2018

Вы используете select (exam1), в то время как он должен быть выбран (exam_1). Вы можете использовать select для этой цели, но я думаю, что простое условие может решить эту проблему намного проще:

data test;
    length source $32;
    do source='99', '34.5', '105', 'ND';
        output;
    end;
run;

data result(drop = convertedValue);
    set test;

    if (source eq 'ND') then do;
        result = 0;
    end;
    else do;
        convertedValue = input(source,??best.);
        if not missing(convertedValue) then do;
            if (0 <= round(convertedValue, 1E-12) <= 100) then do;
                result = convertedValue;
            end;
        end;
    end;
run;

input (source, ?? best.) пытается преобразовать source в число, и в случае сбоя (например, значения содержат какое-то слово), он не выводит ошибку и просто продолжает исполнение.

round (convertValue, 1E-12) используется, чтобы избежать погрешности точности при сравнении. Если вы хотите сделать это абсолютно безопасно, вы должны использовать что-то вроде

if (0 < round(convertedValue,1E-12) < 100
    or abs(round(convertedValue,1E-12)) < 1E-10 
    or abs(round(convertedValue-100,1E-12)) < 1E-10
) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...