将2个sas数据集转换为2个矩阵以执行除法并乘以数千

时间:2017-06-08 15:43:17

标签: sas

两个数据集都具有相同数量的列和列名称。我将大多数列名存储在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的划分。下一个对列的下一个回答的累积加法

enter image description here

1 个答案:

答案 0 :(得分:1)

在基础SAS中,这并不是特别困难。当然,在IML中它更容易,但是如果你不熟悉IML,除非你想学习它,否则没有特别的理由去研究它。

这是一种方式;有一些有趣的选项也使用加权,但我发现这很好,简单,易于阅读和理解。首先,我初始化onetwo,然后完成工作。编辑以反映您的数据和一些代码更改,尤其是添加运行总计概念。底部的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;