当我有多次出现我的id变量时,我想知道在SAS中转换数据的最佳方法。我知道我可以在proc transpose语句中使用let选项来执行此操作,但我不想删除任何数据,因为我打算计算平均值。
以下是我的数据和代码示例:
data grades;
input student testnum grade;
cards;
1 1 30
1 1 25
1 2 45
1 3 67
2 1 22
2 2 63
2 2 12
2 2 77
3 1 22
3 1 17
3 2 14
3 4 17
;
run;
proc sort data=grades;
by student testnum;
run;
proc transpose data=grades out=trgrades;
by student;
id testnum;
var grade;
run;
以下是我希望结果数据集的显示方式:
student testnum1 testnum2 testnum3 testnum4 avg12 avg34
1 30 45 67 . 33.33 67
1 25 . . . 33.33 67
2 22 63 . . 43.5 .
2 . 12 . . 43.5 .
2 . 77 . . 43.5 .
3 22 14 . 17 53 17
3 17 . . . 53 17
我想使用这个新数据集(不确定如何)来创建新列,这些列是学生(avg12)的所有testnum1和testnum2的平均分数,以及所有testenum3和testnum4(avg34)的平均分数学生。
可能有一种更有效的方法来做到这一点,但我很难过。 任何建议都表示赞赏。
答案 0 :(得分:3)
如果您真正需要的是所有测试1和2的平均值,以及每个学生的3和4的平均值,那么您根本不需要转置。您只需要一个简单的数据步骤:
data grouped;
set grades;
if testnum In (1,2) then group=1;
else if testnum in (3,4) then group=2;
run;
然后是基本的proc means
:
proc means data=grouped;
by student group;
var grade;
output out=averages mean=groupaverage;
run;
如果您需要单次观察中的平均值,则可以轻松转置averages
数据集。
proc transpose data=grades out=trgrades;
by student;
id group;
var grade;
run;
更新
如@Keith所述,使用格式对测试进行分组也是一个很好的选择。跳过数据步骤并创建如下格式:
proc format;
value TestGroup
1,2 = 'Tests 1 and 2'
3,4 = 'Tests 3 and 4'
;
run;
然后proc means
变为:
proc means data=grouped;
by student testnum;
var grade;
format testnum TestGroup.;
output out=averages mean=groupaverage;
run;
结束更新
如果由于某种原因,您确实需要在一次观察中获得所有测试分数,那么我建议使用数据步骤使它们具有唯一可识别性。使用by
,testnum.first
,retain
和一个简单的计数器为每个分数分配retake
个数字。现在,您的转置使用retake
和 testnum
作为id
变量。你应该能够从那里弄明白。
现在真的希望我不会为你做SAS的家庭作业。