问题描述
Z 25 26 27 ... 100
0 300 200 200 100
1 278 262 177 45
2 168 222 122 22
(第一行也是标题)。
现在我想在表格中添加更多20个观察值:
Z 25 26 27 ... 100
0 300 200 200 100
1 278 262 177 45
2 168 222 122 22
3 84 111 61 11
...
22 84 111 61 11
(所有Z = 3到22的观测)=(Z = 2的观测)* 1/2。反正有这样做吗?
解决方法
特殊变量名称列表_numeric_
用于排列所有数字变量。在该数组上循环可以让您将所选行的每个变量除以2
。
示例:
data have;
input Z _25 _26 _27 _100;
datalines;
0 300 200 200 100
1 278 262 177 45
2 168 222 122 22
run;
data newrows(drop=last_z);
set have nobs=nobs point=nobs; * read last row;
last_z = z;
array _ _numeric_; * array all numeric variables;
do _n_ = 1 to dim(_);
_(_n_) = _(_n_) / 2; * divide each variable by 2;
end;
do z = last_z + 1 to last_z + 20; * output 20 'new' rows;
output;
end;
stop;
run;
proc append base=have data=newrows;
run;
,
请明确说明,SAS变量名称不能为数字。但是,这给您您想要的东西
data have;
input z a b c;
datalines;
0 300 200 200
1 278 262 177
2 168 222 122
;
data want;
set have end=lr;
array arr a--c;
output;
if lr;
do over arr;
arr = arr / 2;
end;
do _N_ = 1 to 20;
z + 1;
output;
end;
run;
更新代码:
data have;
do z = 0,1,2;
array arr _25-_100;
do over arr;
arr = ceil(rand('uniform')*100);
end;
output;
end;
run;
data want;
set have end=lr;
array arr _25--_100;
output;
if lr;
do over arr;
arr = arr / 2;
end;
do _N_ = 1 to 20;
z + 1;
output;
end;
run;