Обратный порядок столбцов SAS

Проблема:

Я хочу изменить порядок всех столбцов в наборе данных sas. Должен ли я достичь этого, сначала транспонируя, а затем используя цикл для изменения порядка столбцов? Это моя логика...

Шаг первый:

data pre_transpose; 
            set sashelp.class;
            *set &&dataset&i.. ;    
                _row_ + 1;              * Unique identifier ;
                length _charvar_ $20;   * Create 1 character variable ;
            run; 

Выход первого шага:

предварительно транспонировать

Шаг второй: переворачивать ли здесь столбцы?

proc transpose data = pre_transpose out = middle (where = (lowcase(_name_) ne '_row_'));
                by _row_;
                var _all_;
            quit; 

Шаг второй. Выход:

транспонировать

РЕДАКТИРОВАТЬ:

Я пробовал это:

/* use proc sql to create a macro variable for column names */ 
            proc sql noprint; 
                select varnum, nliteral(name) 
                into :varlist, :varlist separated by ' '
                from dictionary.columns
                where libname = 'WORK' and memname = 'all_character'
                order by varnum desc;
            quit;

            /* Use retain to maintain format */ 
            data reverse_columns;
            retain &varlist.;
            set all_character;
            run;        

But I did not achieve the results I was looking for - the column order is not reversed. 

person datanalyst    schedule 12.03.2018    source источник
comment
Код @tom работал у меня, и он работает. Пожалуйста, измените memname = 'ALL_CHARACTER', ваш код ничего не выбирает в макропеременную, потому что предложение where не работает. Все имена таблиц (memname) хранятся в верхнем регистре, а у вас они в нижнем регистре.   -  person Kiran    schedule 13.03.2018


Ответы (1)


Вам просто нужно получить список имен переменных. Один из способов — использовать метаданные. Сделайте, если ваш набор данных является членом HAVE в libref WORK, тогда вы можете использовать это, чтобы получить список имен переменных в одну переменную макроса.

proc sql noprint;
  select varnum , nliteral(name)
    into :varlist, :varlist separated by ' ' 
  from dictionary.columns
  where libname='WORK' and memname='HAVE'
  order by varnum desc 
  ;
quit;

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

data want ;
   retain &varlist ;
   set have ;
run;

Обратите внимание, что значения libname и memname в DICTIONARY.COLUMNS указаны только в верхнем регистре.

person Tom    schedule 12.03.2018
comment
это не изменило порядок столбцов для меня. См. отредактированный пост для кода. Форматы выглядят одинаково до запуска этого кода и после него. - person datanalyst; 12.03.2018
comment
Убедитесь, что запрос SQL находит имена переменных. Значения LIBNAME и MEMNAME в таблицах метаданных хранятся только в верхнем регистре. - person Tom; 13.03.2018