SAS-使用输入将现有字符变量值更改为数字

时间:2018-11-01 06:43:25

标签: sas type-conversion

具有一个名为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 :(得分:3)

您的代码有几个问题。将rename语句作为输入数据集的数据集选项将在读取数据之前执行重命名。因此,exam1将不存在,因为现在称为exam_1。仍将其定义为字符列,因此input函数将不起作用。

您需要保留现有列,创建一个新的数字列进行转换,然后删除旧列并重命名新列。这可以作为针对输出数据集的数据集选项来完成。

tranwrd函数会将所有出现的'ND'替换为'0',然后将inputbest12信息一起使用将读取所有数据为数字。读数字时不必指定长度(即2.代表2位数字,3.代表3位数字,等等)。

data cleaned_up (drop=exam1 rename=(exam_1=exam1));
set df;
exam_1 = input(tranwrd(exam1,'ND','0'),best12.);
run;

答案 1 :(得分:2)

您正在使用select(exam1),而应该是select(exam_1)。您可以将select用于此目的,但我认为简单的 if 条件可以更轻松地解决此问题:

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;

输入(来源,最好的)尝试将来源转换为数字,并且如果失败(例如,值包含某些单词),则不会输出错误并继续执行。

round(convertedValue,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
) 

答案 2 :(得分:2)

尝试使用ifc函数,然后转换为数字变量。

data have;
input x $3.;
_x=input(ifc(x='ND','0',x),best12.);
cards;
3
10
ND
;