如何在SAS中对id变量进行多次观察转置数据?

时间:2013-06-20 22:59:04

标签: sas transpose

当我有多次出现我的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)的平均分数学生。

可能有一种更有效的方法来做到这一点,但我很难过。 任何建议都表示赞赏。

1 个答案:

答案 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;

结束更新


如果由于某种原因,您确实需要在一次观察中获得所有测试分数,那么我建议使用数据步骤使它们具有唯一可识别性。使用bytestnum.firstretain和一个简单的计数器为每个分数分配retake个数字。现在,您的转置使用retake testnum作为id变量。你应该能够从那里弄明白。

现在真的希望我不会为你做SAS的家庭作业。