如何使用 proc SQL is SAS 合并多个变量
How do I merge by more than one variable using proc SQL is SAS
我在 SAS 中有 2 个数据集:
main_1
ID Rep 剂量反应
1 2 34 567
1 1 45 756
2 1 35 456
3 1 56 345
main_2
ID 代表小时日
1 1 89 157
2 1 62 365
3 1 12 689
我可以很容易地先通过 ID 合并这两个数据集,然后通过 Rep(因为其中一个 ID 有两个观察值)使用 SAS 中的以下代码:
proc import out=main_1
datafile='/folders/myfolders/sasuser.v94/main_1.xls'
dbms=xls replace;
/*optional*/
sheet='Sheet1';
getnames=yes;
run;
proc import out=main_2
datafile='/folders/myfolders/sasuser.v94/main_2.xls'
dbms=xls replace;
/*optional*/
sheet='Sheet1';
getnames=yes;
run;
/*merge datasets based on common variable (ID then Rep)*/
/*first sort all datasets by target variables*/
proc sort data=main_1;
by ID Rep;
proc sort data=main_2;
by ID Rep;
run;
/*can now be merged*/
data main_merge;
merge main_1 main_2;
by ID Rep;
run;
这会产生以下结果 table:
ID Rep Dose Response Hour Day
1 1 45 756 89 157
1 2 34 567 。 .
2 1 35 456 62 365
3 1 56 345 12 689
我目前有以下 proc SQL 替代方案(我正在学习,很抱歉它很糟糕)但似乎不能合并超过 1 个变量(即 ID 和 Rep):
proc sql;
create table merged_sql as
select L.*, R.*
from main_1 as L
LEFT JOIN main_2 as R
on L.ID = R.ID;
quit;
生成以下内容:
ID Rep Dose Response Hour Day
1 2 34 567 89 157
1 1 45 756 89 157
2 1 35 456 62 365
3 1 56 345 12 689
关于 proc SQL 代码的任何建议,以实现与以前相同的 table?我当前的代码将“89 157”添加到两个 ID=1 观察结果中。
非常感谢。
你快完成了...
proc sql;
create table merged_sql as
select L.*,
R.HOUR,
R.DAY
from main_1 as L
LEFT JOIN main_2 as R
on L.ID = R.ID
and L.REP = R.REP;
quit;
不使用 R.*
的原因是为了避免出现关于重复 ID 和 REP 字段的注释或警告。
我在 SAS 中有 2 个数据集:
main_1
ID Rep 剂量反应
1 2 34 567
1 1 45 756
2 1 35 456
3 1 56 345
main_2
ID 代表小时日
1 1 89 157
2 1 62 365
3 1 12 689
我可以很容易地先通过 ID 合并这两个数据集,然后通过 Rep(因为其中一个 ID 有两个观察值)使用 SAS 中的以下代码:
proc import out=main_1
datafile='/folders/myfolders/sasuser.v94/main_1.xls'
dbms=xls replace;
/*optional*/
sheet='Sheet1';
getnames=yes;
run;
proc import out=main_2
datafile='/folders/myfolders/sasuser.v94/main_2.xls'
dbms=xls replace;
/*optional*/
sheet='Sheet1';
getnames=yes;
run;
/*merge datasets based on common variable (ID then Rep)*/
/*first sort all datasets by target variables*/
proc sort data=main_1;
by ID Rep;
proc sort data=main_2;
by ID Rep;
run;
/*can now be merged*/
data main_merge;
merge main_1 main_2;
by ID Rep;
run;
这会产生以下结果 table:
ID Rep Dose Response Hour Day
1 1 45 756 89 157
1 2 34 567 。 .
2 1 35 456 62 365
3 1 56 345 12 689
我目前有以下 proc SQL 替代方案(我正在学习,很抱歉它很糟糕)但似乎不能合并超过 1 个变量(即 ID 和 Rep):
proc sql;
create table merged_sql as
select L.*, R.*
from main_1 as L
LEFT JOIN main_2 as R
on L.ID = R.ID;
quit;
生成以下内容:
ID Rep Dose Response Hour Day
1 2 34 567 89 157
1 1 45 756 89 157
2 1 35 456 62 365
3 1 56 345 12 689
关于 proc SQL 代码的任何建议,以实现与以前相同的 table?我当前的代码将“89 157”添加到两个 ID=1 观察结果中。
非常感谢。
你快完成了...
proc sql;
create table merged_sql as
select L.*,
R.HOUR,
R.DAY
from main_1 as L
LEFT JOIN main_2 as R
on L.ID = R.ID
and L.REP = R.REP;
quit;
不使用 R.*
的原因是为了避免出现关于重复 ID 和 REP 字段的注释或警告。