SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1732|回复: 11
打印 上一主题 下一主题

统计学生选择题回答正确的个数

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-4-12 20:11:43 | 只看该作者

统计学生选择题回答正确的个数

代码:
data a;
input id$ q1$ q2$ q3$@@;
cards;
01 a b c 02 a b a
03 b a c 04 a b c
;
run;

data b(drop=i);
num=0;                     
set a;
array q(3);
array crt(3) $_temporary_('a','b','c');
do i=1 to 3;
if q(i)=crt(i) then num+1;
end;
run;

对数据集a,一共有三道选择题,四个学生给出了答案,而每一题的正确答案只有一个,分别是a:b:c。 数据集b中的num给出了每个学生选择题回答正确的个数。

上面的段代码功能只是完成对单选题的判断,要求把单选题的统计个数,改为对多选题的统计。  有多少办法能够实现它!!
方法不要求唯一,大侠们给的代码可以越多越好,让小生跟更多的人也好多学习学习下啊!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-4-13 11:08:40 | 只看该作者

Re: 统计学生选择题回答正确的个数

多关注下啊!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-4-13 20:42:35 | 只看该作者

Re: 统计学生选择题回答正确的个数

假如统计多选的测试数据如下:
01   a   bc b
02   ac  c  c
03   a   cb  b
04   c  b   b


测试答案为 a,bc,b

其中的bc与cb 看做是同一答案,类似的也一样
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-4-18 01:06:11 | 只看该作者

Re: 统计学生选择题回答正确的个数

[code:9pmlc5t8]data a;
input id$ q1$ q2$ q3$@@;
cards;
01 a bc b
02 ac c c
03 a cb b
04 c b b
;
run;

data b(drop=i);
num=0;
set a;
array q(3);
array crt(3) $_temporary_('a','bc|cb','b');
do i=1 to 3;
if prxmatch('m/'||crt(i)||'/i',q(i)) then num+1;
end;
run;

[/code:9pmlc5t8]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-4-19 21:20:46 | 只看该作者

Re: 统计学生选择题回答正确的个数

斤点把这个贴给忘了,多谢byes的回复啊,代码中给的方法非常好,在面对选项答案更复杂的时候,也可应用到,比如学生给的答案中除了顺序可以颠倒外,中间还可能涉及到逗号‘ ,’跟多个空格或者还有大小写等多种情况,下面引用下前边byes的那段很好的代码,首先在这里先赞一个,呵呵!!
代码:
[code:3pzr6r9p]
data a;
infile cards dsd;
input id$ q1$ q2$ q3$@@;
cards;
01, a ,"b, c", b
02,"a c", c, c
03, A, "c , b", b
04, C, B, B,
;
run;

data b(drop=i);
num=0;
set a;
array q(3);
array crt(3) $_temporary_('(a|A)','(b|B) *,? *(c|C)|(c|C) *,? *(B|b)','(B|b)');
do i=1 to 3;
if prxmatch('m/'||crt(i)||'/i',q(i)) then num+1;
end;
run;

[/code:3pzr6r9p]
不过改动后 id 为 03 的 q2 好像没有统计出来,也还没找到啥原因造成滴!
最后随便问下那个匹配函数中的m代表的是什么啊?小弟基础功还不扎实,没看明白,也查不到资料,哎!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-4-20 01:02:41 | 只看该作者

Re: 统计学生选择题回答正确的个数

[code:21ihk3j3]
data b(drop=i j);
num=0;
set a;
array q(3);
array crt(3) $_temporary_('a','Bc','B');
length c $8;/*存储答案(剔除非字母)*/
array t(4) $1 _temporary_ ;/*假设多选的结果最多是4个*/
do i=1 to 3;
        c=compress(q(i),,'ak');
        do j=1 to 4;
                if j<=length(crt(i)) then t(j)=substr(crt(i),j,1);
                else t(j)=t(j-1);
        end;
        if prxmatch('m/'||t(1)||'/i',c)
        and prxmatch('m/'||t(2)||'/i',c)
        and prxmatch('m/'||t(3)||'/i',c)
        and prxmatch('m/'||t(4)||'/i',c)
        and not prxmatch('m/[^'||crt(i)||']/i',c)
        then num+1;
end;
run;
[/code:21ihk3j3]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-4-21 08:50:57 | 只看该作者

Re: 统计学生选择题回答正确的个数

[quote="byes":p50sc2i3][code:p50sc2i3]
data b(drop=i j);
num=0;
set a;
array q(3);
array crt(3) $_temporary_('a','Bc','B');
length c $8;/*存储答案(剔除非字母)*/
array t(4) $1 _temporary_ ;/*假设多选的结果最多是4个*/
do i=1 to 3;
c=compress(q(i),,'ak');
do j=1 to 4;
if j<=length(crt(i)) then t(j)=substr(crt(i),j,1);
else t(j)=t(j-1);
end;
if prxmatch('m/'||t(1)||'/i',c)
and prxmatch('m/'||t(2)||'/i',c)
and prxmatch('m/'||t(3)||'/i',c)
and prxmatch('m/'||t(4)||'/i',c)
and not prxmatch('m/[^'||crt(i)||']/i',c)
then num+1;
end;
run;
[/code:p50sc2i3][/quote:p50sc2i3]

谢谢byes了,还是不清楚 prxmatch中的那个m是啥含义,有没有谁可以提供点相关资料的啊!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-4-23 17:41:16 | 只看该作者

Re: 统计学生选择题回答正确的个数

有谁还能帮忙找一下前面那段程序统计出错的原因在哪里呀?我都试过好几遍了,id 为 03 的 q2 列始终没统计出来,想知道!!
代码重新粘贴一下:
[code:1z7lv6po]
data a;
infile cards dsd;
input id$ q1$ q2$ q3$@@;
cards;
01, a ,"b, c", b
02,"a c", c, c
03, A, "c , b", b
04, C, B, B,
;
run;

data b(drop=i);
num=0;
set a;
array q(3);
array crt(3) $_temporary_('(a|A)','(b|B) *,? *(c|C)|(c|C) *,? *(B|b)','(B|b)');
do i=1 to 3;
if prxmatch('m/'||crt(i)||'/i',q(i)) then num+1;
end;
run;

[/code:1z7lv6po]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-4-23 21:51:18 | 只看该作者

Re: 统计学生选择题回答正确的个数

[quote="天性爱好者":13qd3ko5]有谁还能帮忙找一下前面那段程序统计出错的原因在哪里呀?我都试过好几遍了,id 为 03 的 q2 列始终没统计出来,想知道!!
代码重新粘贴一下:
[code:13qd3ko5]
data a;
infile cards dsd;
input id$ q1$ q2$ q3$@@;
cards;
01, a ,"b, c", b
02,"a c", c, c
03, A, "c , b", b
04, C, B, B,
;
run;

data b(drop=i);
num=0;
set a;
array q(3);
array crt(3) $_temporary_('(a|A)','(b|B) *,? *(c|C)|(c|C) *,? *(B|b)','(B|b)');
do i=1 to 3;
if prxmatch('m/'||crt(i)||'/i',q(i)) then num+1;
end;
run;

[/code:13qd3ko5][/quote:13qd3ko5]

主要问题在这段 [color=#FF0000:13qd3ko5]'(b|B) *,? *(c|C)[b:13qd3ko5]|[/b:13qd3ko5](c|C) *,? *(B|b)' [/color:13qd3ko5] 里面,我试了如果匹配组()里面还含有含有匹配组的话,会出错,如: '[color=#FF0000:13qd3ko5]( [/color:13qd3ko5](b|B) *,? *(c|C)[b:13qd3ko5]|[/b:13qd3ko5](c|C) *,? *(B|b) [color=#FF0000:13qd3ko5])[/color:13qd3ko5]' ,但是最外面如果没有加上匹配组时,这段里面只有前面部分[color=#FF0000:13qd3ko5] (b|B) *,? *(c|C) [/color:13qd3ko5]有效,所以 id 为 01 的 q2列[color=#FF0000:13qd3ko5]"b, c"[/color:13qd3ko5]能够统计出来,而 id 为 03 的 q2列[color=#FF0000:13qd3ko5]"c , b"[/color:13qd3ko5]就不会统计出来,不知道有没有谁可以在这段 '(b|B) *,? *(c|C)[b:13qd3ko5]|[/b:13qd3ko5](c|C) *,? *(B|b)' 的基础之上解决此问题。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-4-23 23:10:55 | 只看该作者

Re: 统计学生选择题回答正确的个数

哎,试了好久,终于找到解决该问题的办法啦,在 * 号前面有个空格,把它用括号括起来变成这样()*
即把  '(b|B) *,? *(c|C)|(c|C) *,? *(B|b)   改成  '(c|C)[color=#FF0000:1qk01gml]()[/color:1qk01gml]*,?[color=#FF0000:1qk01gml]()[/color:1qk01gml]*(B|b)|(b|B)[color=#FF0000:1qk01gml]()[/color:1qk01gml]*,?[color=#FF0000:1qk01gml]()[/color:1qk01gml]*(c|C)'  
代码:
[code:1qk01gml]
data a;
infile cards dsd;
input id$ q1$ q2$ q3$@@;
cards;
01, a ,"b, c", b
02,"a c", c, c
03, A, "c , b", b
04, C, B, B,
;
run;

data b(drop=i);
num=0;
set a;
array q(3);
array crt(3) $_temporary_('(a|A)','(c|C)()*,?()*(B|b)|(b|B)()*,?()*(c|C)','(B|b)');
do i=1 to 3;
if prxmatch('m/'||crt(i)||'/i',q(i)) then num+1;
end;
run;

[/code:1qk01gml]

前面的这个[color=#FF0000:1qk01gml]([/color:1qk01gml]id 为 01 的 q2列[color=#FF0000:1qk01gml]"b, c"[/color:1qk01gml]能够统计出来,而 id 为 03 的 q2列[color=#FF0000:1qk01gml]"c , b"[/color:1qk01gml]就不会统计出来[color=#FF0000:1qk01gml] )[/color:1qk01gml]问题是到解决了,不过新问题又产生了,经过测试发现,[color=#FF0000:1qk01gml]id 号 为 02 的 q2 列不正确,却把它统计成正确的了[/color:1qk01gml],这下更搞不清源头了!! 好心的大哥大姐们就把代码拿去测试测试,帮忙找找缘由吧!!谢谢啦!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 13:02 , Processed in 0.072914 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表