0

当我的 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

我想使用这个新数据集(还不确定如何)来创建新列,这些列是学生的所有 testnum1 和 testnum2 的平均分数(avg12)以及学生的所有 testenum3 和 testnum4 的平均值(avg34)。

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

4

1 回答 1

4

如果您真正需要的是每个学生的所有测试 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 家庭作业。

于 2013-06-21T03:09:56.213 回答