是否可以合并两个数据集,其中第一个变量的值用于 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;