我从45个问题的调查中得到了一组多项选择答案,并且我已将正确的答案作为我在数据集中的第一个观察点。
在我的DATA步骤中,我想将值设置为0或1,这取决于每个观察中的变量是否与第一个观察中的相同变量匹配,我想用0或1替换响应字母(AD)数据集,我该如何进行比较?
我没有进行任何分组,所以我相信我可以使用First.x访问第一行,但我不确定如何在每个变量之间进行比较(answer1-answer45)。
| Id | answer1 | answer2 | ...through answer 45
|:-------------|---------:|
| KEY | A | B |
| 2 | A | C |
| 3 | C | D |
| 4 | A | B |
| 5 | D | C |
| 6 | B | B |
Should become:
| Id | answer1 | answer2 | ...through answer 45
|:-------------|---------:|
| KEY | A | B |
| 2 | 1 | 0 |
| 3 | 0 | 0 |
| 4 | 1 | 1 |
| 5 | 0 | 0 |
| 6 | 0 | 1 |
用于读取数据的当前代码:
DATA TEST(drop=name fill answer0);
INFILE SCORES DSD firstobs=2;
length id $4;
length answer1-answer150 $1;
INPUT name $ fill id $ (answer0-answer150) ($);
RUN;
提前致谢!
答案 0 :(得分:2)
这是我怎么做的。创建一个数据集到PROC COMPARE KEY到观察到的。然后你有X不匹配密钥和缺少匹配。然后,您可以使用PROC TRANSREG对“X”进行评分。'到01. PROC TRANSREG还创建宏变量,其中包含新变量和数字的名称。
来自日志注意:_TRGINDN = 2 _TRGIND = answer1D answer2D
data questions;
input id:$3. (answer1-answer2)(:$1.);
cards;
KEY A B
2 A C
3 C D
4 A B
5 D C
6 B B
;;;;
run;
data key;
if _n_ eq 1 then set questions(obs=1);
set questions(keep=id firstobs=2);
run;
proc compare base=key compare=questions(firstobs=2) out=comp outdiff noprint;
id id;
run;
options validvarname=v7;
proc transreg design data=comp(drop=_type_ type=data);
id id;
model class(answer:) / noint;
output out=scored(drop=intercept _:);
run;
%put NOTE: &=_TRGINDN &=_TRGIND;
答案 1 :(得分:1)
我家里没有SAS许可证,所以我无法实际测试此代码。我会给你最好的拍摄,但是......
首先,我会将我的正确答案保存在一个单独的表格中,然后merge
将其与受访者的答案保持一致。如果您在同一个表中有更多的多项选择解决方案和答案,那么这也使解决方案具有可扩展性,因为您也可以加入作业ID。
现在,将所有正确答案导入到表answers_correct
,其列名为answer_correct1-answer_correct45。
然后,合并两个表并确定每个问题的结果。
DATA outcome;
MERGE answers answers_correct;
* We will not be using any BY.;
* If you later add more questionnaires, merge BY the questionnaire ID;
ARRAY answer(*) answer1-answer45;
ARRAY answer_correct(*) answer_correct1-answer_correct45;
LENGTH result1-result45 $1;
ARRAY result(*) result1-result45;
DROP i;
FOR i = 1 TO DIM(answer);
IF answer(i) = answer_correct(i) THEN result(i) = '1';
ELSE result(i) = '0';
END;
RUN;