在数据集中添加变量(列)(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本意是字符变量,因为宏变量是字符但没有引号那么肯定会出错。您应该使用 symbolgenmprint 选项,然后使用 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,_);