两个数据集都具有相同数量的列和列名称。我将大多数列名存储在sorted_cols宏中,该宏基本上用空格分隔。在两个sas数据集中还存在另外一列作为ID。这些值中的一些值为null(。)。为了将数据集转换为矩阵m1,我尝试了这个。
proc iml
varNames = {&sorted_col};
use Sashelp.Class(OBS=31);
read all var varNames into m1;
close Sashelp.Class;
print m[colname=VarNames];
quit;
显然这是在抛出错误。
我想我应该提到一些我不知道在哪里添加的数据集。我认为下一步很容易通过(m1 / m2)* 1000,其中m1和m2是2个矩阵并存储在一个新的矩阵中。可能会尝试将其写回数据集。我在sas中非常天真。
这是我的目标一个是dataset1,两个是数据集2我想要得到的是从dataset2(一个)的元素1对dataset2(两个)进行element1的划分。下一个对列的下一个回答的累积加法
答案 0 :(得分:1)
在基础SAS中,这并不是特别困难。当然,在IML中它更容易,但是如果你不熟悉IML,除非你想学习它,否则没有特别的理由去研究它。
这是一种方式;有一些有趣的选项也使用加权,但我发现这很好,简单,易于阅读和理解。首先,我初始化one
和two
,然后完成工作。编辑以反映您的数据和一些代码更改,尤其是添加运行总计概念。底部的PROC方法是运行总计的替代方案 - 它只有在您删除了运行总计(与tempsums
相关的两条线)时才有效,就像它在运算总计中的总和一样,这是不正确的。
data one;
input (d_201409-d_201412) (:best.);
row_label = _n_-1;
datalines;
3768 7079 6933 8451
3768 7079 6933 8448
3768 7079 6933 8447.4
3768 7079 6933 8447
3768 7079 6933 8447
3768 7079 6933 8445.86667
;;;;
run;
data two;
input (d_201409-d_201412) (:best.);
row_label = _n_-1;
datalines;
. 1 . 1
. 4 . 1
. . . .
. . 1 .
1 . . 1
. . 1 1
;;;;
run;
%let vars=d_201409-d_201412;
data one_div_two;
set one; *dividend first, then divisor;
array vars &vars.;
array tempstore[1000] _temporary_; *1000 is arbitrary, something large as or larger than &vars size;
array tempsums[1000] _temporary_; *same idea;
do _i = 1 to dim(vars); *store dividend in temporary array;
tempstore[_i] = vars[_i];
end;
set two;
do _i = 1 to dim(vars); *now we divide original number by stored dividend;
vars[_i] = 1000 * divide(vars[_i],tempstore[_i]);
tempsums[_i] = sum(tempsums[_i],vars[_i]); *store away the running total;
vars[_i] = tempsums[_i]; *and retrieve it;
end;
run;
proc means data=one_div_two noprint; *and we summarize. Could do this in the above step too, but easier here.;
var &vars.;
output out=id_Summ sum=;
run;