循环遍历多个数据集以创建一个独特的数据集

Looping through several datasets for creating a unique one

我想在 SAS 中创建一个宏,它根据某些设置运行一些代码。 我有三个数据集,df1df2df3,它们都保存在 work 库中。 并不是所有的都需要使用:可能是我想比较 df1df2,或者只是考虑 df3。我的目标是使用 this/these dataset/s 中的特定信息创建一个新数据集。 df1df2df3 具有相同的变量但不同的观测值。

例如:

df1
Name Surname Username Score
A.    B.      bad     24
B.    J.      none92  54
 

df2 
Name Surname Username  Score
Jenny    B.      jben42  25
S.       C.      btw     34
H.       H.      hhhg241 64

df3   
Name Surname Username  Score
F.    B.      gd523  22
H.    G.G.    df51  34

宏逻辑应该是:

我试过如下测试宏:

%macro select_datasets(df1, df2, df3, action);

%let dataset1=df1;
%let dataset2=df2;
%let dataset3=df3;

%if &dataset1=y and &dataset2=y and &dataset3=y %then %let dataset_list= &dataset1 &dataset2 &dataset3;
%if &action=1 %then %do; /* create a dataframe that include the observations from all the datasets */
%end;

%mend;

%select_datasets(df1=y, df2=y, df3=y, 1);

上面的宏没有return任何输出,不过,可能意味着在逻辑和实现上存在一些错误。 我需要一个最终数据集

Name Surname Username Score
A.    B.      bad     24
B.    J.      none92  54
Jenny    B.      jben42  25
S.       C.      btw     34
H.       H.      hhhg241 64
F.    B.      gd523  22
H.    G.G.    df51  34

即使有两个或一个数据集而不是 3 个,宏也应该可以工作。

为什么不直接创建列表?

%macro select_datasets(list, action);
    %if &action=1 %then %do;
            data want;
                set &list.;
            run;
    %end;
%mend;
%select_datasets(list=df1 df3, action=1);

这样你就不必担心所有可能的情况。

Example:
data df1 df2 df3;
    length name :. surname :. username :. score 8;
    name="A";
    surname="B";
    username="bad";
    score=24;
    output df1;
    name="B";
    surname="C";
    username="good";
    score=25;
    output df2;
    name="C";
    surname="D";
    username="idk";
    score=26;
    output df3;
run;

%select_datasets(list=df1 df3, action=1);

Output:

name surname username score
  A     B      bad      24
  C     D      idk      26

我重建你的代码.... 尝试使用选项 symbolgen 和 mlogic 在日志中查看结果。 我认为您想要的是一个宏变量 dataset_list,其中包含您要加入的数据集的名称。

options symbolgen mlogic;
%macro select_datasets(df1, df2, df3, action);

%let dataset1=df1;
%let dataset2=df2;
%let dataset3=df3;

%if &df1=y and &df2=y and &df3=y %then %let dataset_list= &dataset1 &dataset2 &dataset3;
%if &action=1 %then %do; /* create a dataframe that include the observations from all the datasets */
%put &dataset_list;
%end;

%mend;

%select_datasets(df1=y, df2=y, df3=y, action=1);