在数据集中添加变量(列)(SAS)
Add a variable (column) in data set (SAS)
我找不到这个简单问题的解决方案:我想在我的数据集中添加一个 colum/variable。该变量将始终具有相同的值,存储在宏变量 &value 中。我在一个宏中,所以我不知道它是否改变了什么……这是合并 2 个数据步骤之前的步骤。
到目前为止,这是我所拥有的:
%do i=1 %to 10;
data &new_data_set;
set &new_data_set;
Nom_controle=&Nom_Controle;
Partenaire=&Partenaire;
run;
%end;
我正在尝试向我的数据集(之前在宏中定义为 &new_data_set)添加一个名为“Nom_Controle”的 column/variable,它始终采用存储在宏变量 &Nom_controle 中的值(之前也定义过)。我还试图添加第二个名为“Partenaire”的 column/variable,它始终采用存储在宏变量 &Partenaire(之前也已定义)中的值。
当然,正如我在这里发布的那样,我的代码不起作用。你能帮帮我吗?
编辑:在有人问我为了帮助我之后,这里是这个代码来自的宏(完整的东西):
%macro presence_mouvement (data_set_detail_mouvement, data_set_mouvement);
%if %sysfunc(exist(&data_set_mouvement)) AND %sysfunc(exist(&data_set_detail_mouvement)) %then %do; *Check if my data set actually exist;
%let suffix=_2;
%let new_data_set=&data_set_detail_mouvement&suffix; *Create the name of the new data set I'm going to save the result of the next proc sql in;
proc SQL noprint; *Proc to look for errors in a previous data set and print it in the new data set;
create table &new_data_set as
insert into &new_data_set
SELECT num_mouvement
FROM &data_set_detail_mouvement
EXCEPT
SELECT num_mouvement
FROM &data_set_mouvement);
%let Nom_controle=Presence_mouvement; *Creation of a new variable;
%if %sysfunc(length(&data_set_detail_mouvement))=29 %then %do; *Creation of a second variable (value conditional to the size of a previous variable);
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 3)); %end;
%else %if %sysfunc(length(&data_set_detail_mouvement))=30 %then %do;
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 4)); %end;
%else %do;
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 6)); %end;
%do i=1 %to 10;
data &new_data_set;
set &new_data_set;
Nom_controle=&Nom_Controle;
Partenaire=&Partenaire;
run;
%end;
%end;*End of the actions to do in case the two data set in parameters exist;
%else %do; *Actions to do in case the two data set in parameters don't exist;
data _null_;
file print;
put #3 @10 "At least one of the data set does not exist";
run;
%end;
*This macro is aiming at pointing error in a previous data set, print them in a new data set and add two new variables/columns to this new data set (indicating their origin). The next set is going to be to merge this new data set to another one;
%mend presence_mouvement;
%presence_mouvement (sasuser.bgpi__detail_mouvement, sasuser.bgpi__mouvement);
我还想说我在尝试添加新变量之前测试了宏的其余部分,因此宏的其余部分应该没有任何问题。但是谁知道...
创建变量的代码部分似乎没有问题。如果不查看整个代码或日志,可能很难从该摘录中分辨出其他问题。比如Nom_controle和Partenaire本意是字符变量,因为宏变量是字符但没有引号那么肯定会出错。您应该使用 symbolgen
和 mprint
选项,然后使用 post 日志来帮助解决问题。
运行 单个数据步骤,将新变量设置为宏变量中设置的值。如果值设置本质上是字符,则数据步骤变量需要在双引号内解析那些宏变量。
data &new_data_set;
set &new_data_set;
retain
Nom_controle "&Nom_Controle"
Partenaire "&Partenaire"
;
* also works;
* Nom_controle = "&Nom_Controle";
* Partenaire = "&Partenaire";
run;
注意:新的数据集变量长度将设置为存储在宏变量中的值的长度。
数据集是值的矩形。它将具有一定数量的数字和/或字符类型的行和列。 DATA 步中的 SET
语句将 table 的列值的一行读入 运行ning 程序数据向量——这实际上是 DATA 步中的变量。 DATA 步自动循环并在各种条件下自动停止,例如正在读取 SET table 的最后一行。
我不知道你为什么有宏循环%DO I=1 %TO 10
。我可能推测您认为您需要这样做才能在 &new_data_set.
中 'update' 10 行
它到底在做什么? 运行使用相同的代码 10 次!没有宏,实际代码 运行 类似于以下
data x; do r = 1 to 10; output; end; run; %* an original new_data_set;
data x; set x; z=1; run;
data x; set x; z=1; run;
data x; set x; z=1; run;
...
另一个问题是
这样的代码
%if %sysfunc(length(&data_set_detail_mouvement))=29 %then %do; *Creation of a second variable (value conditional to the size of a previous variable);
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 3)); %end;
您似乎是从完全限定的 libname.dataset 中获取数据集名称的前 3、4 或第 6 个字母,其中 libname 被假定为 sasuser
。一个更安全、更健壮的版本可能是
%let syslast = &data_set_detail_mouvement;
%let libpart = %scan(&syslast,1,.);
%let datapart = %scan(&syslast,2,.);
… extract 3, 4, or 6 preface of datapart …
%* this might be helpful;
%let Partenaire = %scan(&datapart,1,_);
我找不到这个简单问题的解决方案:我想在我的数据集中添加一个 colum/variable。该变量将始终具有相同的值,存储在宏变量 &value 中。我在一个宏中,所以我不知道它是否改变了什么……这是合并 2 个数据步骤之前的步骤。 到目前为止,这是我所拥有的:
%do i=1 %to 10;
data &new_data_set;
set &new_data_set;
Nom_controle=&Nom_Controle;
Partenaire=&Partenaire;
run;
%end;
我正在尝试向我的数据集(之前在宏中定义为 &new_data_set)添加一个名为“Nom_Controle”的 column/variable,它始终采用存储在宏变量 &Nom_controle 中的值(之前也定义过)。我还试图添加第二个名为“Partenaire”的 column/variable,它始终采用存储在宏变量 &Partenaire(之前也已定义)中的值。 当然,正如我在这里发布的那样,我的代码不起作用。你能帮帮我吗?
编辑:在有人问我为了帮助我之后,这里是这个代码来自的宏(完整的东西):
%macro presence_mouvement (data_set_detail_mouvement, data_set_mouvement);
%if %sysfunc(exist(&data_set_mouvement)) AND %sysfunc(exist(&data_set_detail_mouvement)) %then %do; *Check if my data set actually exist;
%let suffix=_2;
%let new_data_set=&data_set_detail_mouvement&suffix; *Create the name of the new data set I'm going to save the result of the next proc sql in;
proc SQL noprint; *Proc to look for errors in a previous data set and print it in the new data set;
create table &new_data_set as
insert into &new_data_set
SELECT num_mouvement
FROM &data_set_detail_mouvement
EXCEPT
SELECT num_mouvement
FROM &data_set_mouvement);
%let Nom_controle=Presence_mouvement; *Creation of a new variable;
%if %sysfunc(length(&data_set_detail_mouvement))=29 %then %do; *Creation of a second variable (value conditional to the size of a previous variable);
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 3)); %end;
%else %if %sysfunc(length(&data_set_detail_mouvement))=30 %then %do;
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 4)); %end;
%else %do;
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 6)); %end;
%do i=1 %to 10;
data &new_data_set;
set &new_data_set;
Nom_controle=&Nom_Controle;
Partenaire=&Partenaire;
run;
%end;
%end;*End of the actions to do in case the two data set in parameters exist;
%else %do; *Actions to do in case the two data set in parameters don't exist;
data _null_;
file print;
put #3 @10 "At least one of the data set does not exist";
run;
%end;
*This macro is aiming at pointing error in a previous data set, print them in a new data set and add two new variables/columns to this new data set (indicating their origin). The next set is going to be to merge this new data set to another one;
%mend presence_mouvement;
%presence_mouvement (sasuser.bgpi__detail_mouvement, sasuser.bgpi__mouvement);
我还想说我在尝试添加新变量之前测试了宏的其余部分,因此宏的其余部分应该没有任何问题。但是谁知道...
创建变量的代码部分似乎没有问题。如果不查看整个代码或日志,可能很难从该摘录中分辨出其他问题。比如Nom_controle和Partenaire本意是字符变量,因为宏变量是字符但没有引号那么肯定会出错。您应该使用 symbolgen
和 mprint
选项,然后使用 post 日志来帮助解决问题。
运行 单个数据步骤,将新变量设置为宏变量中设置的值。如果值设置本质上是字符,则数据步骤变量需要在双引号内解析那些宏变量。
data &new_data_set;
set &new_data_set;
retain
Nom_controle "&Nom_Controle"
Partenaire "&Partenaire"
;
* also works;
* Nom_controle = "&Nom_Controle";
* Partenaire = "&Partenaire";
run;
注意:新的数据集变量长度将设置为存储在宏变量中的值的长度。
数据集是值的矩形。它将具有一定数量的数字和/或字符类型的行和列。 DATA 步中的 SET
语句将 table 的列值的一行读入 运行ning 程序数据向量——这实际上是 DATA 步中的变量。 DATA 步自动循环并在各种条件下自动停止,例如正在读取 SET table 的最后一行。
我不知道你为什么有宏循环%DO I=1 %TO 10
。我可能推测您认为您需要这样做才能在 &new_data_set.
它到底在做什么? 运行使用相同的代码 10 次!没有宏,实际代码 运行 类似于以下
data x; do r = 1 to 10; output; end; run; %* an original new_data_set;
data x; set x; z=1; run;
data x; set x; z=1; run;
data x; set x; z=1; run;
...
另一个问题是
这样的代码 %if %sysfunc(length(&data_set_detail_mouvement))=29 %then %do; *Creation of a second variable (value conditional to the size of a previous variable);
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 3)); %end;
您似乎是从完全限定的 libname.dataset 中获取数据集名称的前 3、4 或第 6 个字母,其中 libname 被假定为 sasuser
。一个更安全、更健壮的版本可能是
%let syslast = &data_set_detail_mouvement;
%let libpart = %scan(&syslast,1,.);
%let datapart = %scan(&syslast,2,.);
… extract 3, 4, or 6 preface of datapart …
%* this might be helpful;
%let Partenaire = %scan(&datapart,1,_);