循环浏览多个数据集以创建一个唯一的数据集



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

例如:

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);

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

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 :$8. surname :$8. username :$8. 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);

相关内容

最新更新