我有以下数据集
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转置我可以使用,或者可能做转置,然后解决问题。但我无法解决这个问题。任何帮助,将不胜感激。
答案 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;