具有一个名为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;
显然不起作用。我究竟做错了什么?
答案 0 :(得分:3)
您的代码有几个问题。将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;
答案 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
;