SAS proc转置

时间:2018-03-25 10:20:15

标签: sas transpose proc

我有以下数据集

Account 1       Account 2       Account1Amount    Account2Amount 
A.              B.              25.               55
F.              D.              10.               70

当我通过帐户1和帐户2进行转置时,我得到以下内容

      Amount 1.        Amount 2.        Col1
           25.                    55.                   A
           25.                    55.                   B
           10.                    70.                   F
           10.                    70.                   D

但我想要以下

    Amount 1.        Amount 2.        Col1
           25.                    0                      A
           0.                     55.                   B
           10.                    0                      F
           0.                      70.                   D

换句话说,我不希望每个帐户的金额都被重复计算,因为它会影响我在不同帐户中的真实总数。这也是数据的样本,我实际上有185行。

我只是不知道如何解决这个问题。是否有一个选项是proc转置我可以使用,或者可能做转置,然后解决问题。但我无法解决这个问题。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

原始数据集是我认为非典型的。它似乎包含两组并行的信息,没有任何明确的密钥。

data have;
input
Account_1 $     Account_2 $     Account1Amount    Account2Amount; datalines;
A.              B.              25.               55
F.              D.              10.               70
run;

所述结果似乎来自此转置:

proc transpose data=have out=got;
  by account_1 account_2;
  var account1amount account2amount;
run;

使用数据步骤数组和输出语句,最简单地转换并行数据可能是最简单的。仅使用transpose将涉及两个转置和set堆叠输出。

data want_stated;
  set have;
  array accounts account_1 account_2;
  array amounts account1amount account2amount;
  array amount amount1 amount2;

  col1 = accounts(1);
  amount(1) = amounts(1);
  amount(2) = 0 ;

  output;

  col1 = accounts(2);
  amount(1) = 0;
  amount(2) = amounts(2);

  output;
run;

更多使用有用的正常分类转置形式可能是帐户/金额向量(如Tom所述)

data want_maybe;
  set have;
  array accounts account_1 account_2;
  array amounts account1amount account2amount;
  group = _n_;
  do _n_ = 1 to dim(accounts);
    account = accounts(_n_);
    amount = amounts(_n_);
    output;
  end;
  keep group account amount;
run;

答案 1 :(得分:0)

另一种方法,如果您的列数很少

   proc sql;
   select Account_1,  Account1Amount, 0  from 
   have 
   union
   select Account_2, 0, Account2Amount from 
   have b;