在 SAS 中生成人口数据集
Generating a Population Data Set in SAS
我是 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;
不太确定这会有什么帮助,但这似乎可以帮助您:
首先在长列表中创建 rows/columns 值,然后根据需要翻转到宽结构。这是动态的,可以很容易地针对任意数量的 rows/columns 或选择的 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;
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 以获得四边形重复。
既然您似乎想以四位递增,那么一点算术应该可以解决问题。只测试当前行是否小于当前列数乘以 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
我是 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;
不太确定这会有什么帮助,但这似乎可以帮助您:
首先在长列表中创建 rows/columns 值,然后根据需要翻转到宽结构。这是动态的,可以很容易地针对任意数量的 rows/columns 或选择的 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;
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 以获得四边形重复。
既然您似乎想以四位递增,那么一点算术应该可以解决问题。只测试当前行是否小于当前列数乘以 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