我有一个包含50名obs(员工)和多名vars的数据库: 问题q1,q2 ....,q10 => q1-q10满意度为1-5 性别,比例为1和0 比例为1的状态=已婚0 =单身 收入 重量 教育年 等等..
众所周知,数据存在拼写错误。我需要遍历数据库并检测: 哪些变量有错字错误 哪(员工)员工有错误
我该如何定义条件? 例如:错误可能是两位数(性别= 00而不是0),或者值超过规模(q2 = 8)。 我应该分别为每个var定义错误吗? 对于显而易见的,它很容易,但一般来说,检测var =教育年份的错误,我做“重量=< 0”,因为它只是常识吗?
proc print data=comb;
where inc<0;
where gender ne 0&1;
where married ne 0&1;
where q1-q10 ne 1-5;
where w=<0;
where h=<0;
where edc<0;
检测到错误后我需要纠正错误: 如果两个数字相似(例如性别= 00)。我应该只展示其中一个=&gt; (性别= 0)。 如何只打印第一个数字(对于这个特定的修正?) 如果价值超过规模则转为缺失。 再次,我是否分别为每个var做这个?
data comb;
if gender ne 0 & 1 then gender=
else if married ne 0&1 then married=
else if q1-q10 ne 5-10 then q1-q10='';
else if
run;
无论哪种方式,我都不确定如何正确构建这些条件。
答案 0 :(得分:0)
除了像您一直在做的那样定义标准之外,没有快速识别/纠正错误的方法。但是,您似乎知道需要纠正的标准以及如何纠正它。 SAS需要通过更好的传递,这在这种情况下是好的,因为您可以在同一次传递数据中识别和纠正它们。
我不确定您是否需要确定哪些记录已更正错误但我已在下面添加了do循环以另外设置cleanflg=1
- 或者您可以交换此消息以将消息放入日志文件(例如putlog "NO" "TE: Variable Gender has been corrected from the original value of " gender= ;
(例如):
data clean ;
set dirty ;
array Q[10] q1-q10 .;
if inc<0 then cleanflg=1 ; *Although assume it may be better to delete;
if gender not in('0','1','00') the do ;
cleanflg=1 ;
gender=.;
end ;
if married not in(0,1) then do ;
cleanflg=1 ;
married=.;
end ;
*Loop through Question array to set to missing if outside required range ;
do i=1 to 10 ;
if Q[i] > 5 or Q[i]<1 then do ;
cleanflg=1 ;
Q[i]=. ;
end ;
end ;
run ;