SAS Array <array-elements> для перехода на 10

Я хочу добиться того же результата, но вместо кодирования каждого элемента массива используйте что-то вроде var1 - var10, но это подскочит на 10, как десятилетия.

data work.test(keep= statename pop_diff:);
    set sashelp.us_data(keep=STATENAME POPULATION:);

    array population_array {*} POPULATION_1910 -- POPULATION_2010;
    dimp = dim(population_array);
/* here and below something like:
array pop_diff_amount {10} pop_diff_amount_1920 -- pop_diff_amount_2010;*/  

    array pop_diff_amount {10}  pop_diff_amount_1920 pop_diff_amount_1930 
                                pop_diff_amount_1940 pop_diff_amount_1950 
                                pop_diff_amount_1960 pop_diff_amount_1970 
                                pop_diff_amount_1980 pop_diff_amount_1990 
                                pop_diff_amount_2000 pop_diff_amount_2010;

    array pop_diff_prcnt {10}   pop_diff_prcnt_1920 pop_diff_prcnt_1930 
                                pop_diff_prcnt_1940 pop_diff_prcnt_1950 
                                pop_diff_prcnt_1960 pop_diff_prcnt_1970 
                                pop_diff_prcnt_1980 pop_diff_prcnt_1990 
                                pop_diff_prcnt_2000 pop_diff_prcnt_2010;

    do i=1 to dim(population_array) - 1;
        pop_diff_amount{i} = population_array{i+1} - population_array{i};
        pop_diff_prcnt{i} = (population_array{i+1} / population_array{i} -1) * 100;
    end;

RUN;

Я все еще новичок в этом, поэтому не уверен, что это возможно или легко. Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
114
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Не автоматический, но и не такой уж и сложный. Сначала создайте набор данных имен, затем транспонируйте и используйте неисполненный набор, чтобы ввести имена, а затем определите массивы. Обратите внимание на то, как массивы определяются с помощью [*] и name: так же, как вы это делали с Population_array.

data names;
   do type = 'Amount','Prcnt';
      do year=1920 to 2010 by 10;
         length _name_ $32;
         _name_ = catx('_','pop_diff',type,year);
         output;
         end;
      end;
   run;
proc print;
   run;
proc transpose data=names out=pop_diff(drop=_name_);
   var;
   run;
proc contents varnum;
   run;

data pop;
   set sashelp.us_data(keep=STATENAME POPULATION:);
   array population_array {*} POPULATION_1910 -- POPULATION_2010;

   if 0 then set pop_diff;
   array pop_diff_amount[*] pop_diff_amount:;
   array pop_diff_prcnt[*]   pop_diff_prcnt:;
   do i=1 to dim(population_array) - 1;
      pop_diff_amount{i} = population_array{i+1} - population_array{i};
      pop_diff_prcnt{i} = (population_array{i+1} / population_array{i} -1) * 100;
      end;
   run;
proc print data=pop;
   run;

SAS автоматически увеличивает элементы массива на 1. Вот альтернативное решение, которое создает переменные с использованием одного дополнительного шага для создания набора макропеременных, которые содержат желаемые имена переменных. Поскольку вы основываете их на переменной POPULATION_<year>, мы просто возьмем годы из этих имен переменных, создадим имена переменных для массивов, которые нам нужны, и сохраним их в нескольких макропеременных.

proc sql noprint;
    select cats('pop_diff_amount_', scan(name, -1, '_') )
         , cats('pop_diff_prcnt_', scan(name, -1, '_') ) 
    into :pop_diff_amount_vars separated by ' '
       , :pop_diff_prcnt_vars separated by ' '
    from dictionary.columns
    where     libname = 'SASHELP'
          AND memname = 'US_DATA'
          AND upcase(name) LIKE 'POPULATION_%'
    ;
quit;

data work.test(keep= statename pop_diff:);
    set sashelp.us_data(keep=STATENAME POPULATION:);

    array population_array {*} POPULATION_1910 -- POPULATION_2010;
    dimp = dim(population_array);

    array pop_diff_amount {*}  &pop_diff_amount_vars.;

    array pop_diff_prcnt {*}   &pop_diff_prcnt_vars.;

    do i=1 to dim(population_array) - 1;
        pop_diff_amount{i} = population_array{i+1} - population_array{i};
        pop_diff_prcnt{i} = (population_array{i+1} / population_array{i} -1) * 100;
    end;

RUN;

Получение данных из метаданных (создание переменной года) упростило бы жизнь кодированию.

proc transpose data=sashelp.us_data out=us_pop(rename=(col1=Population));
   by statename;
   var population_:;
   run;
data us_pop;
   set us_pop;
   by statename;
   year = input(scan(_name_,-1,'_'),4.);
   pop_diff_amount=dif (population);
   pop_diff_prcnt =(population/lag(population))-1;
   format pop_diff_prcnt percent10.2;
   if first.statename then call missing(of pop_diff_amount pop_diff_prcnt);
   drop _:;
   run;
proc print data=us_pop(obs=10);
   run;

Другие вопросы по теме