o********s 发帖数: 853 | 1 背景是要检查测试人员是否完成了规定的一组测试。
标准的测试是有3组,每一组内有不同数量和内容的测试,测试人员只须选取其中的一
组或几组并完成该组内的所有测试,如果完成了组内的所有测试,该组就可标记为"完
成",否则,要记为"未完成"。
假如标准测试分组内容为
data std;
input grp_st $ msr_st $;
cards;
g1 g1m1
g1 g1m2
g2 g2m1
g2 g2m2
g2 g2m3
g3 g3m1
g3 g3m2
;
测试GROUP1有2个测试,GROUP2有3个,GROUP3有2个。
实际测试人员完成的情况为
data have;
input tester $ grp $ msr $;
cards;
t1 g1 g1m1
t1 g1 g1m2
t1 g2 g2m1
t2 g1 g1m1
t3 g2 g2m1
t3 g2 g2m2
t4 g3 g3m1
t4 g3 g3m2
;
实际操作中,TESTER1完成了GROUP1中的2个,但没有完成GROUP2中3个,所以对于
TESTER1,GROUP1应标记为"完成",GROUP2为"未完成"。类似的,TESTER2,
GROUP1"未完成"。TESTER3,GROUP2"未完成"。TESTER4,GROUP3"完成"。
该如何用SAS实现?多谢。 |
P****D 发帖数: 11146 | 2 如果这是实际情况的话,把数据transpose成每个组的每个测试都是一个独立variable
、每个observation是一个人的样子,好比这样:
tester g1m1 g1m2 g2m1
1 Y N Y
然后就很简单了。
如果实际上测试非常多,就不要transpose了,保持数据是long,把测试单列成一个
variable,然后用proc sql的sum。
【在 o********s 的大作中提到】 : 背景是要检查测试人员是否完成了规定的一组测试。 : 标准的测试是有3组,每一组内有不同数量和内容的测试,测试人员只须选取其中的一 : 组或几组并完成该组内的所有测试,如果完成了组内的所有测试,该组就可标记为"完 : 成",否则,要记为"未完成"。 : 假如标准测试分组内容为 : data std; : input grp_st $ msr_st $; : cards; : g1 g1m1 : g1 g1m2
|
o********s 发帖数: 853 | 3 thanks, the tests are not too many, less than 7 in each group.
Can you explain more about the "long" method, it seems like a universal way,
and better.
Thanks agin.
variable
【在 P****D 的大作中提到】 : 如果这是实际情况的话,把数据transpose成每个组的每个测试都是一个独立variable : 、每个observation是一个人的样子,好比这样: : tester g1m1 g1m2 g2m1 : 1 Y N Y : 然后就很简单了。 : 如果实际上测试非常多,就不要transpose了,保持数据是long,把测试单列成一个 : variable,然后用proc sql的sum。
|
P****D 发帖数: 11146 | 4 proc sql;
create table count
/* count the number of tests completed by each tester in each group */
as
select have.tester, sum((have.grp="g1")) as compg1 label="# of tests
completed in Group 1", sum((have.grp="g2")) as compg2 label="# of tests
completed in Group 2", sum((have.grp="g3")) as compg3 label="# of tests
completed in Group 3"
from have
group by tester
;
quit;
data detercomp;
set count;
if compg1<2 then CompleteG1=1; else CompleteG1=0;
label CompleteG1="Tester complete Group 1 (yes/no)";
run;
way,
【在 o********s 的大作中提到】 : thanks, the tests are not too many, less than 7 in each group. : Can you explain more about the "long" method, it seems like a universal way, : and better. : Thanks agin. : : variable
|
o********s 发帖数: 853 | 5 thanks, but maybe I didn't express myself clearly enough. I can't just check
the number of measures, I have to make sure the measures that a tester did
for a group is the correct measures in that particular group (i.e. the name
of the measures have to match with standard).
tests
【在 P****D 的大作中提到】 : proc sql; : create table count : /* count the number of tests completed by each tester in each group */ : as : select have.tester, sum((have.grp="g1")) as compg1 label="# of tests : completed in Group 1", sum((have.grp="g2")) as compg2 label="# of tests : completed in Group 2", sum((have.grp="g3")) as compg3 label="# of tests : completed in Group 3" : from have : group by tester
|
P****D 发帖数: 11146 | 6 You didn't mention anything like "meeting standards"... I am not sure I
follow you. All I know is that my code achieves this goal of yours: 所以对于
TESTER1,GROUP1应标记为"完成",GROUP2为"未完成"。类似的,TESTER2,
GROUP1"未完成"。TESTER3,GROUP2"未完成"。TESTER4,GROUP3"完成"。
Please provide more clarification.
check
did
name
【在 o********s 的大作中提到】 : thanks, but maybe I didn't express myself clearly enough. I can't just check : the number of measures, I have to make sure the measures that a tester did : for a group is the correct measures in that particular group (i.e. the name : of the measures have to match with standard). : : tests
|
r***9 发帖数: 140 | 7 你楼上的解释的很清楚了,应该每组完成数,再加上你楼上的得出实际完成数,你用条
件语句判断一下就得出你想要的。
check
did
name
【在 o********s 的大作中提到】 : thanks, but maybe I didn't express myself clearly enough. I can't just check : the number of measures, I have to make sure the measures that a tester did : for a group is the correct measures in that particular group (i.e. the name : of the measures have to match with standard). : : tests
|
l****u 发帖数: 529 | 8 proc sql;
create table new as
select distinct tester, msr, grp ,max(case when index=0 then 'Not Done'
else '' end) as status
from( select s.*, h.*,sum(case when msr_st=msr then 1 else 0 end )as
index
from have h, std s
where h.grp=s.grp_st
group by tester,grp_st, msr_st)
group by tester,grp_st;
quit; |
o********s 发帖数: 853 | 9 不只是完成数,还要比较完成的测试是不是该组的测试。比如说,组1的测试是1和2,
但如果他完成了2和3,虽说是两个测试,但所作的测试不对,也不能说“完成”了。所
以,只检查测试的个数是不行的。
【在 r***9 的大作中提到】 : 你楼上的解释的很清楚了,应该每组完成数,再加上你楼上的得出实际完成数,你用条 : 件语句判断一下就得出你想要的。 : : check : did : name
|
P****D 发帖数: 11146 | 10 组1里根本没有3啊,他怎么完成3?
要是你的数据很脏,那你自己清理。清理之后能像你的have一样就可以用我的code。
【在 o********s 的大作中提到】 : 不只是完成数,还要比较完成的测试是不是该组的测试。比如说,组1的测试是1和2, : 但如果他完成了2和3,虽说是两个测试,但所作的测试不对,也不能说“完成”了。所 : 以,只检查测试的个数是不行的。
|
o********s 发帖数: 853 | 11 组1里没有3,但如果他做了3并作为组1里的测试提交了,虽说他组1提交了2个测试,符
合组1测试个数的要求,但组1应该做测试1和2,他却提交了测试2和3,就说明他做错了
,也就“未完成”。所以光比较个数不行。
【在 P****D 的大作中提到】 : 组1里根本没有3啊,他怎么完成3? : 要是你的数据很脏,那你自己清理。清理之后能像你的have一样就可以用我的code。
|