在SAS中生成人口数据集

时间:2019-06-11 17:31:30

标签: arrays sas nested-loops sas-macro do-loops

我对SAS非常陌生,我正在尝试生成分类变量的总体数据集。我需要获取包含400个观察值和99个变量的数据集。第一列(变量1)将具有4 1和396 0,第二列(变量2)将具有8 1和392 0,依此类推,直到最后一列(变量99)将具有396 1和4。 0。我一直在尝试生成此数据集,但到目前为止还没有运气。我相信我必须利用MACROS和DO-LOOPS,ARRAYS甚至嵌套的LOOPS。

到目前为止,这是我所拥有的,但我很高兴我与实际的解决方案相去甚远;

DATA population;
    ARRAY pop V1-V99;
        DO N=1 TO 400;
           DO i=1 TO dim(pop);
               pop(i)=.....;
           END;
        DROP i;
        DROP N;
        END;
RUN;

3 个答案:

答案 0 :(得分:1)

不确定是否有帮助,但这似乎可以帮助您:

首先在长列表中创建行/列值,然后根据需要翻转为宽结构。这是动态的,可以轻松修改任意数量的行/列或1的选择。 1只是按顺序选择的,您没有指定它们是随机的还是顺序的。

 data have;
 *loop over 99 columns;
 do col=1 to 99;
     *create row values, using 4 rule and basic math for loop counting;
     do row=1 to 400;
         if row <= col*4 then val=1; 
         else val=0;
         output;
     end;
end;
run;

*sort for transpose;
proc sort data=have;
    by row col;
run;

*flip to desired structure;
proc transpose data=have out=want prefix=COL;
by row;
var VAL;
id col;
run;

*check # of 1's per col;
proc means data=want N SUM;
var COL1-COL99;
run;

答案 1 :(得分:1)

由于您似乎想增加四分之一的技巧,因此可以解决问题。只需测试当前行是否小于当前列数乘以4。

data population;
  do row=1 to 400;
    id='ID'||put(row,z3.);
    array vars v1-v99 ;
    do col=1 to dim(vars);
      vars[col]= row <= 4*col;
    end;
    output;
  end;
  drop row col;
run;

要查看数量是否合适,可以将它们加起来:

proc means sum; run;

结果:

Variable             Sum
------------------------
v1             4.0000000
v2             8.0000000
v3            12.0000000
v4            16.0000000
v5            20.0000000
v6            24.0000000
v7            28.0000000
v8            32.0000000
v9            36.0000000
v10           40.0000000
v11           44.0000000
...
v96          384.0000000
v97          388.0000000
v98          392.0000000
v99          396.0000000

答案 2 :(得分:0)

data line;
do i = 1 to 100;
    do j = 1 to 100;
        select; 
            when (i > j) k = 0;
            otherwise k = 1;
        end;
        output;
    end;    
end;
run;

proc transpose data = line
out = cube (drop = _NAME_);
by i;
id j;
var k;
run;

proc sql;
create table quad_cube_prep as
select t1.* from cube t1
union all
select t2.* from cube t2
union all
select t3.* from cube t3
union all
select t4.* from cube t4
;quit;

proc sort data = quad_cube_prep out=quad_cube (drop = i) ; by i;

基本上生成10000个条目的行列 使用转置将其折叠100以得到一个立方体。 并合并所有x4以获得四边形重复。