循环遍历多个数据集以创建一个独特的数据集
Looping through several datasets for creating a unique one
我想在 SAS 中创建一个宏,它根据某些设置运行一些代码。
我有三个数据集,df1
、df2
和 df3
,它们都保存在 work
库中。
并不是所有的都需要使用:可能是我想比较 df1
和 df2
,或者只是考虑 df3。我的目标是使用 this/these dataset/s 中的特定信息创建一个新数据集。 df1
、df2
和 df3
具有相同的变量但不同的观测值。
例如:
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);
我想在 SAS 中创建一个宏,它根据某些设置运行一些代码。
我有三个数据集,df1
、df2
和 df3
,它们都保存在 work
库中。
并不是所有的都需要使用:可能是我想比较 df1
和 df2
,或者只是考虑 df3。我的目标是使用 this/these dataset/s 中的特定信息创建一个新数据集。 df1
、df2
和 df3
具有相同的变量但不同的观测值。
例如:
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);