是否可以合并两个数据集,其中第一个变量的值用于 select 第二个变量?
Is it possible to merge two datasets where a variable's value in the first is used to select a variable in the second?
我想知道如何使用第一个数据集中的变量值将 SAS 中的两个数据集合并到 select 并测试第二个数据集中的变量。
例如考虑两个数据集。第一个数据集包含四个婴儿的名字和他们的出生日期。第二个数据集包含三位医生和一组指示变量,用于记录每位医生是否在特定日期工作。例如,史密斯博士只在第 2 天和第 3 天工作。我想创建一个数据集,列出婴儿出生当天医生工作的所有可能的婴儿医生组合。
data babies;
input baby_name $ birth_day;
datalines;
Jake 1
Sonny 4
North 5
Apple 6
;
run;
data doctors;
input DrLastname $ day1 day2 day3 day4 day5 day6;
datalines;
Jones 1 0 0 1 1 1
Smith 0 1 1 0 0 0
Lewis 1 1 1 0 0 0
;
run;
解决方案似乎应该是这样的
proc sql;
create table merged as
select babies.*, doctors.*
from babies, doctors
where doctors.day(babies.birth_day) = 1; *<--- incorrect;
quit;
输出应该是:
baby_name birth_day DrLastName
Jake 1 Jones
Jake 1 Lewis
Sonny 4 Jones
North 5 Jones
Apple 6 Jones
我 运行 遇到过这个问题几次,很想知道这种合并在 SAS 中是否可行。感谢您提供的任何帮助。
我可能会移动第二个数据集,然后在当天合并。
类似于(未经测试的伪代码):
data new_1-new_6;
set doctor;
array day_1-day_6 day_{6}
for i in 1 to 6:
if day_{i} = 1 then do;
day = i;
output new_{i};
end;
end;
run;
data stacked;
set day_1-day_6;
run;
然后简单的根据字段天合并
虽然我可能也会转置数据集,但也可以不转置。
data babies_doctors;
set babies;
do _i = 1 to nobs_doctors;
set doctors point=_i nobs=nobs_doctors;
array days day1-day6;
if days[birth_Day] then output;
end;
run;
这不会快速,因为它会检查数据集中的所有行,但这是可能的。
最快的可能是将其加载到垂直散列 table(您可以轻松完成)或临时数组。
data babies_doctors_array;
array drnames[32767] _temporary_;
array drdays[32767,6] _temporary_;
if _n_=1 then do;
do _i = 1 to nobs_doctors;
set doctors point=_i nobs=nobs_doctors;
array days day1-day6;
drnames[_i]=DrLastname;
do _j = 1 to dim(days);
drdays[_i,_j]=days[_j];
end;
end;
end;
set babies;
do _k = 1 to nobs_doctors;
if drdays[_k,birth_day]=1 then do;
baby_drlastname = drnames[_k];
output;
end;
end;
run;
我想知道如何使用第一个数据集中的变量值将 SAS 中的两个数据集合并到 select 并测试第二个数据集中的变量。
例如考虑两个数据集。第一个数据集包含四个婴儿的名字和他们的出生日期。第二个数据集包含三位医生和一组指示变量,用于记录每位医生是否在特定日期工作。例如,史密斯博士只在第 2 天和第 3 天工作。我想创建一个数据集,列出婴儿出生当天医生工作的所有可能的婴儿医生组合。
data babies;
input baby_name $ birth_day;
datalines;
Jake 1
Sonny 4
North 5
Apple 6
;
run;
data doctors;
input DrLastname $ day1 day2 day3 day4 day5 day6;
datalines;
Jones 1 0 0 1 1 1
Smith 0 1 1 0 0 0
Lewis 1 1 1 0 0 0
;
run;
解决方案似乎应该是这样的
proc sql;
create table merged as
select babies.*, doctors.*
from babies, doctors
where doctors.day(babies.birth_day) = 1; *<--- incorrect;
quit;
输出应该是:
baby_name birth_day DrLastName
Jake 1 Jones
Jake 1 Lewis
Sonny 4 Jones
North 5 Jones
Apple 6 Jones
我 运行 遇到过这个问题几次,很想知道这种合并在 SAS 中是否可行。感谢您提供的任何帮助。
我可能会移动第二个数据集,然后在当天合并。
类似于(未经测试的伪代码):
data new_1-new_6;
set doctor;
array day_1-day_6 day_{6}
for i in 1 to 6:
if day_{i} = 1 then do;
day = i;
output new_{i};
end;
end;
run;
data stacked;
set day_1-day_6;
run;
然后简单的根据字段天合并
虽然我可能也会转置数据集,但也可以不转置。
data babies_doctors;
set babies;
do _i = 1 to nobs_doctors;
set doctors point=_i nobs=nobs_doctors;
array days day1-day6;
if days[birth_Day] then output;
end;
run;
这不会快速,因为它会检查数据集中的所有行,但这是可能的。
最快的可能是将其加载到垂直散列 table(您可以轻松完成)或临时数组。
data babies_doctors_array;
array drnames[32767] _temporary_;
array drdays[32767,6] _temporary_;
if _n_=1 then do;
do _i = 1 to nobs_doctors;
set doctors point=_i nobs=nobs_doctors;
array days day1-day6;
drnames[_i]=DrLastname;
do _j = 1 to dim(days);
drdays[_i,_j]=days[_j];
end;
end;
end;
set babies;
do _k = 1 to nobs_doctors;
if drdays[_k,birth_day]=1 then do;
baby_drlastname = drnames[_k];
output;
end;
end;
run;