SAS阵列<;数组元素>;跳10

SAS阵列<;数组元素>;跳10,sas,4gl,Sas,4gl,我希望获得相同的输出,但不是对每个数组元素进行harcoding,而是使用类似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(populatio

我希望获得相同的输出,但不是对每个数组元素进行harcoding,而是使用类似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;
我仍然是it初学者,因此我不确定这是可能的还是容易实现的。
谢谢

不是自动的,但也不是那么难。首先创建一个名称数据集,然后进行转置,并使用一个未执行的集引入名称,然后定义数组。注意数组是如何使用[*]和name:定义的,就像您使用population\u数组一样

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
,我们将简单地从这些变量名中获取年份,为我们想要的数组创建变量名,并将它们存储到几个宏变量中

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;