Добавить переменную (столбец) в набор данных (SAS) - PullRequest
0 голосов
/ 01 июня 2018

Я не могу найти решение этой простой проблемы: я хочу добавить столбец / переменную в мой набор данных.Эта переменная всегда будет иметь одно и то же значение, хранящееся в макропеременной & 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», которая всегда принимаетзначение хранится в макропеременной & Nom_controle (также определено ранее).Я также пытаюсь добавить второй столбец / переменную с именем "Partenaire", которая всегда принимает значение, хранящееся в макропеременной & 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 conditionnal 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);

Я также хотелсказать, что я протестировал остальную часть макроса, прежде чем пытаться добавить новую переменную, чтобы у остальной части макроса не было никаких проблем.Но кто знает ...

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Запустите один шаг данных, установив для новых переменных значения, установленные в макропеременных.Если настройки значений носят символьный характер, переменные шага данных должны разрешать эти макропеременные в двойных кавычках.

data &new_data_set;
  set &new_data_set;
  retain 
    Nom_controle "&Nom_Controle"
    Partenaire   "&Partenaire"
  ;

  * also works;
  * Nom_controle = "&Nom_Controle";
  * Partenaire   = "&Partenaire"; 
run;

Примечание. Длина переменных нового набора данных будет равна длине значений, хранящихся вмакропеременные.

Набор данных представляет собой прямоугольник значений.Он будет иметь определенное количество строк и столбцов числовых и / или символьных типов.Оператор SET на шаге DATA считывает одну строку значений столбца таблицы в вектор данных работающей программы, которые по сути являются переменными на шаге DATA.Шаг DATA зацикливается автоматически и останавливается автоматически при различных условиях, например, при чтении последней строки таблицы SET.

Я не знаю, почему у вас есть макрос цикла %DO I=1 %TO 10.Я могу предположить, что вы думаете, что вам нужно сделать это, чтобы «обновить» 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 conditionnal to the size of a previous variable);
        %let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 3)); %end;

Похоже, вы захватываете первые 3, 4 или 6-йбуквы имени набора данных из полностью определенного libname.dataset где 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,_);
0 голосов
/ 01 июня 2018

Кажется, нет ничего плохого в части кода, которая создает переменные.Могут быть и другие проблемы, которые трудно понять из этого фрагмента, не видя весь код или журнал.Например, если Nom_controle и Partenaire предназначены для символьных переменных, потому что макропеременные являются символами, но без кавычек, тогда определенно будут ошибки.Вы должны использовать опции symbolgen и mprint, а затем опубликовать журнал, чтобы помочь решить проблему.

...