基于其他几个列对列求和 - SAS
Sum columns based on several other columns - SAS
我正在尝试根据其他几列对一些列求和,然后生成一个新的 table 并将结果放入。
假设我有以下数据:
Col1
Col2
Col3
Col4
Col5
Col6
AAAA
BBBB
CCCC
DDDD
3
1
AAAA
BBBB
CCCC
DDDD
5
1
WWWW
XXXX
YYYY
ZZZZ
1
4
WWWW
XXXX
YYYY
ZZZZ
8
2
我想对 Col5 和 Col6(分别)求和,其中 Col 1-4 相同。即我想要的输出是:
Col1
Col2
Col3
Col4
Col5
Col6
AAAA
BBBB
CCCC
DDDD
8
2
WWWW
XXXX
YYYY
ZZZZ
9
6
我已将我的代码放在下面,但它给了我以下内容:
Col1
Col2
Col3
Col4
Col5
Col6
AAAA
BBBB
CCCC
DDDD
8
2
AAAA
BBBB
CCCC
DDDD
8
2
WWWW
XXXX
YYYY
ZZZZ
9
6
WWWW
XXXX
YYYY
ZZZZ
9
6
任何帮助将不胜感激:
a) 将其用于代码工作。
b) 告诉我一个更好(更有效?)的方法?我想我已经大量(!)过度复杂化了(我是 SAS 的新手!)。
---代码---
data XXX;
input Col1 $ Col2 $ Col3 $ Col4 $ Col5 Col6;
datalines;
AAAA BBBB CCCC DDDD 3 1
AAAA BBBB CCCC DDDD 5 1
WWWW XXXX YYYY ZZZZ 1 4
WWWW XXXX YYYY ZZZZ 8 2
;
run;
data test1;
set XXX;
groupID = put(md5(upcase(catx('|',Col1,Col2,Col3,Col4))),hex32.);
run;
proc sort data = test1;
by groupID;
run;
proc summary data = test1;
var Col5 Col6;
by groupID;
Output out = want sum=;
run;
proc sql;
create table test1_results as
select b.Col1,b.Col2,b.Col3,b.Col4, a.*
from want as a
left join test1 as b
on a.groupID = b.groupID;
run;
data Final_table;
set test1_results;
Keep Col1 Col2 Col3 Col4 Col5 Col6;
run;
我认为您需要 Proc SUMMARY。其余步骤是不必要的。
关键概念 - BY 或 CLASS 语句采用多个变量。
data XXX;
input Col1 $ Col2 $ Col3 $ Col4 $ Col5 Col6;
datalines;
AAAA BBBB CCCC DDDD 3 1
AAAA BBBB CCCC DDDD 5 1
WWWW XXXX YYYY ZZZZ 1 4
WWWW XXXX YYYY ZZZZ 8 2
;
run;
proc summary data=xxx NWAY noprint;
class col1 col2 col3 col4;
var Col5 Col6;
Output out=want (drop=_type_ _freq_) sum=;
run;
proc print data=want;run;
我正在尝试根据其他几列对一些列求和,然后生成一个新的 table 并将结果放入。
假设我有以下数据:
Col1 | Col2 | Col3 | Col4 | Col5 | Col6 |
---|---|---|---|---|---|
AAAA | BBBB | CCCC | DDDD | 3 | 1 |
AAAA | BBBB | CCCC | DDDD | 5 | 1 |
WWWW | XXXX | YYYY | ZZZZ | 1 | 4 |
WWWW | XXXX | YYYY | ZZZZ | 8 | 2 |
我想对 Col5 和 Col6(分别)求和,其中 Col 1-4 相同。即我想要的输出是:
Col1 | Col2 | Col3 | Col4 | Col5 | Col6 |
---|---|---|---|---|---|
AAAA | BBBB | CCCC | DDDD | 8 | 2 |
WWWW | XXXX | YYYY | ZZZZ | 9 | 6 |
我已将我的代码放在下面,但它给了我以下内容:
Col1 | Col2 | Col3 | Col4 | Col5 | Col6 |
---|---|---|---|---|---|
AAAA | BBBB | CCCC | DDDD | 8 | 2 |
AAAA | BBBB | CCCC | DDDD | 8 | 2 |
WWWW | XXXX | YYYY | ZZZZ | 9 | 6 |
WWWW | XXXX | YYYY | ZZZZ | 9 | 6 |
任何帮助将不胜感激:
a) 将其用于代码工作。
b) 告诉我一个更好(更有效?)的方法?我想我已经大量(!)过度复杂化了(我是 SAS 的新手!)。
---代码---
data XXX;
input Col1 $ Col2 $ Col3 $ Col4 $ Col5 Col6;
datalines;
AAAA BBBB CCCC DDDD 3 1
AAAA BBBB CCCC DDDD 5 1
WWWW XXXX YYYY ZZZZ 1 4
WWWW XXXX YYYY ZZZZ 8 2
;
run;
data test1;
set XXX;
groupID = put(md5(upcase(catx('|',Col1,Col2,Col3,Col4))),hex32.);
run;
proc sort data = test1;
by groupID;
run;
proc summary data = test1;
var Col5 Col6;
by groupID;
Output out = want sum=;
run;
proc sql;
create table test1_results as
select b.Col1,b.Col2,b.Col3,b.Col4, a.*
from want as a
left join test1 as b
on a.groupID = b.groupID;
run;
data Final_table;
set test1_results;
Keep Col1 Col2 Col3 Col4 Col5 Col6;
run;
我认为您需要 Proc SUMMARY。其余步骤是不必要的。 关键概念 - BY 或 CLASS 语句采用多个变量。
data XXX;
input Col1 $ Col2 $ Col3 $ Col4 $ Col5 Col6;
datalines;
AAAA BBBB CCCC DDDD 3 1
AAAA BBBB CCCC DDDD 5 1
WWWW XXXX YYYY ZZZZ 1 4
WWWW XXXX YYYY ZZZZ 8 2
;
run;
proc summary data=xxx NWAY noprint;
class col1 col2 col3 col4;
var Col5 Col6;
Output out=want (drop=_type_ _freq_) sum=;
run;
proc print data=want;run;