首页 > 解决方案 > 从堆积数据创建列

问题描述

捎带支持我问的一个类似问题(使用宏在数据集中按组对列求和)......

我有以下数据集:

  Month   Cost_Center      Account    Actual    Annual_Budget
  May      53410           Postage       23      134
  May      53420           Postage       7       238
  May      53430           Postage       98      743
  May      53440           Postage       0       417
  May      53710           Postage       102     562
  May      53410           Phone         63      137
  May      53420           Phone         103     909
  May      53430           Phone         90      763
  June     53410           Postage       13      134
  June     53420           Postage       0       238
  June     53430           Postage       48      743
  June     53440           Postage       0       417
  June     53710           Postage       92      562
  June     53410           Phone         73      137
  June     53420           Phone         103     909
  June     53430           Phone         90      763

我想“拼接”它,以便每个月都有自己的实际列,同时按帐户对数值求和。

例如,我希望输出如下所示:

 Account    May_Actual_Sum   June_Actual_Sum   Annual_Budget
 Postage       14562             37960            255251
 Phone         4564               2660            32241

当不需要按月进一步分解时,其他用户提供的以下代码效果很好;但是,我不确定是否可以这样做(我厌倦了添加“按月条款” - 没有用)。

 proc means data=Test N SUM NWAY STACKODS;
  class Account_Description;
  var Actual annual_budget;
  by month; 
  ods output summary = summary_stats1;
  output out = summary_stats2 N = SUM= / AUTONAME;

  data want;
  set summary_stats2;
  run;

标签: sas

解决方案


  1. 使用 PROC MEANS 获取摘要 - 与上次相同。请阅读有关 PROC MEANS 的文档以了解 CLASS 语句的工作原理以及如何控制不同级别的输出。
  2. 使用 PROC TRANSPOSE 翻转数据宽度。由于预算金额在各行之间是一致的,所以你会没事的。

我猜您的下一组问题将是如何正确对列进行排序,因为您的月份不会排序,以及如何动态引用它们来计算本月至今的变化。这是不推荐这种数据结构的一些原因。

    data have;
        input Month  $ Cost_Center  $    Account $   Actual Annual_Budget;
        cards;
      May      53410           Postage       23      134
      May      53420           Postage       7       238
      May      53430           Postage       98      743
      May      53440           Postage       0       417
      May      53710           Postage       102     562
      May      53410           Phone         63      137
      May      53420           Phone         103     909
      May      53430           Phone         90      763
      June     53410           Postage       13      134
      June     53420           Postage       0       238
      June     53430           Postage       48      743
      June     53440           Postage       0       417
      June     53710           Postage       92      562
      June     53410           Phone         73      137
      June     53420           Phone         103     909
      June     53430           Phone         90      763
      ;
        ;
        ;;
    run;

    *summarize;
    proc means data=have noprint nway;
        class account month;
        var actual annual_budget;
        output out=temp sum=actual_total budget_total;
    run;

    *transpose;
    proc transpose data=temp out=want prefix=Month_;
        by account budget_total;
        var actual_total;
        id month;
    run;

输出:

在此处输入图像描述


推荐阅读