【问题标题】:SAS transpose using values as column names and summarizeSAS转置使用值作为列名并汇总
【发布时间】:2014-05-01 06:06:43
【问题描述】:

我正在尝试使用值作为变量名来转置数据并按组汇总数字数据,我尝试使用 proc transpose 和 proc report (across) 但我不能这样做,这是我知道的独特方式这样做是用数据集(if else and sum 但变化不是动态的)

例如我有这个数据集:

school name   subject      picked  saving   expenses
raget  John   math         10      10500    3500
raget  John   spanish      5       1200     2000
raget  Ruby   nosubject    10      5000     1000
raget  Ruby   nosubject    2       3000      0
raget  Ruby   math         3       2000     500
raget  peter  geography    2       1000      0
raget  noname nosubject    0        0       1200

我需要在 1 行中,按学生姓名“选择”的总和,然后按学科选择的总和,最后 3 列是选择、储蓄和费用的总和:

school john ruby peter noname math spanish geography nosubject  picked saving expenses 
raget   15   15   2      0     13   5        2         12        32     22700  8200

如果我在学校或学科有新学生,是否可以动态更改?

【问题讨论】:

    标签: sas transpose


    【解决方案1】:

    这有点困难,因为您在不止一个级别上进行总结,所以我使用了 PROC SUMMARY 并选择了不同的 _TYPE_ 值。见下文:

    数据有; infile 数据线; 输入学校$名称$主题:$ 10。挑选储蓄费用; 数据线; raget 约翰数学 10 10500 3500 raget 约翰西班牙语 5 1200 2000 raget Ruby nosubject 10 5000 1000 raget Ruby nosubject 2 3000 0 raget 红宝石数学 3 2000 500 雷杰彼得地理 2 1000 0 raget noname nosubject 0 0 1200 ; 跑; proc摘要数据=有; 班级学校名称学科; var 选择储蓄费用; 输出out=want1 sum(picked)=picked sum(saving)=saving sum(expenses)=expenses; 跑; proc transpose data=want1 (where=(_type_=5)) out=subs (where=(_NAME_='picked')); 按学校; 身份证件; 跑; proc transpose data=want1 (where=(_type_=6)) out=names (where=(_NAME_='picked')); 按学校; 身份证名称; 跑; 过程 sql; 创建表希望(drop=_TYPE_ _FREQ_ name subject)为 选择 n.*, s.*, w.* 从 want1 (where=(_TYPE_=4)) w, 名称 (drop=_NAME_) n, 潜艇 (drop=_NAME_) s 其中 w.school = n.school w.school = s.school; 辞职;

    我还通过添加新学校、名称和科目来测试此代码,它们确实出现在决赛桌中。你会注意到我没有硬编码任何东西(例如没有引用math或John),所以代码足够动态。

    【讨论】:

      【解决方案2】:

      PROC REPORT 是一个有趣的替代方案,特别是如果您想要打印输出而不是作为数据集。您可以使用ODS OUTPUT 来获取输出数据集,但是由于某种原因没有定义变量名称(它们是“C2”等),因此它很混乱。这个打印输出有点乱,因为标题行没有对齐,但如果需要,可以通过一些小技巧来修复。

      data have;
      input school $ name   $ subject      $ picked  saving   expenses;
      datalines;
      raget  John   math         10      10500    3500
      raget  John   spanish      5       1200     2000
      raget  Ruby   nosubject    10      5000     1000
      raget  Ruby   nosubject    2       3000      0
      raget  Ruby   math         3       2000     500
      raget  peter  geography    2       1000      0
      raget  noname nosubject    0        0       1200
      ;;;;
      run;
      
      ods output report=want;
      proc report nowd data=have;
      columns school (name subject),(picked) picked=picked2 saving expenses;
      define picked/analysis sum ' ';
      define picked2/analysis sum;
      define saving/analysis sum ;
      define expenses/analysis sum;
      define name/across;
      define subject/across;
      define school/group;
      run;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        相关资源
        最近更新 更多