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

将2个sas数据集转换为2个矩阵以执行除法和千乘运算,sas,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=Va

两个数据集的列数和列名相同。我将大多数列名存储在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方面相当幼稚。 这是我的目标,一个是数据集1,二个是数据集2,我想得到的是将数据集2的元素1除以数据集1的元素1(一)。接下来,对上一个答案的下一列进行累积平差


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

这是一种方式;使用权重也有一些有趣的选择,但我发现这很好,很简单,也很容易阅读和理解。首先,我初始化一个和两个,然后进行工作。编辑以反映您的数据和一些代码更改,特别是添加running total概念。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;

你想执行elementwise除法吗?是的,我需要elementwise除法你真的需要去IML吗(你在那里做其他事情吗)?在基本SAS中,元素分割是完全可行的。在这一步之后,我想获取每个bucket(id)的累积值来绘制一个图形。我在数据集中看到了什么来检查它是否工作正常?打开它
PROC PRINT
it?我刚刚更新了一个示例,我不确定这是否就是它的性能。您的示例看起来与您的问题并不匹配。所有的空格都是什么?那些缺少的最好是0。我可以使用这个
proc stdize out=zeros reponly missing=0;运行