Sas 两个数据集中公共变量的乘积

Sas 两个数据集中公共变量的乘积,sas,Sas,在a1和a2中有许多常用列(具有不同值的数字列)。我想将Value计算为这些公共列的“sumproduct” 我尽量避免使用类似于a.common1*b.common1+a.common2*b.common2+…的东西,这需要相当多的代码才能使其动态。我会这样分解它: 获取每个数据集中存在的变量列表 合并列表以获得公共变量列表 在一个数据步骤中将其输入到一些数组逻辑中 稍后将发布一些代码,但希望这足以给您一些想法。据我所知,需要一些预处理步骤 加载您的数据: data a1 a b c 2

a1
a2
中有许多常用列(具有不同值的数字列)。我想将
Value
计算为这些公共列的“sumproduct”


我尽量避免使用类似于
a.common1*b.common1+a.common2*b.common2+…

的东西,这需要相当多的代码才能使其动态。我会这样分解它:

  • 获取每个数据集中存在的变量列表
  • 合并列表以获得公共变量列表
  • 在一个数据步骤中将其输入到一些数组逻辑中

稍后将发布一些代码,但希望这足以给您一些想法。

据我所知,需要一些预处理步骤

加载您的数据:

data a1

a b c
2 3 4
1 2 3

data a2

a b  d
0 .3 1
0 .2 0


proc sql;
create table a3 as
select a.*, a.a * b.a + a.b * b.b as Value
from a1 a, a2 b;
提取A1和A2数据集中的所有变量名(如果需要,更新您的libname):

仅保留两个数据集共用的变量:

proc sql ;
create table data1 as
select libname, memname, name, label
    from sashelp.vcolumn
    where libname= 'WORK' and memname in ('A1','A2')
    order by name
;quit ;
将公共变量的列表和计数放入宏变量:

data data2 ;
  set data1 ;
  by name ;
  if last.name and not first.name ;
run ;
读入源数据集-加载第一个数据集,将其传输到临时数组(因此它们不会覆盖变量值),然后加载第二个数据集,并在do循环中进行计算:

proc sql ;
select name
  into :commvarnames separated by ' ' 
  from data2
;
select count(name)
  into :commoncount
  from data2
;quit ;

是的,我想这似乎有点复杂。我应该尝试使用一些预处理来避免这种计算。谢谢。这真的很有帮助。看来使用数组是不可避免的。
proc sql ;
select name
  into :commvarnames separated by ' ' 
  from data2
;
select count(name)
  into :commoncount
  from data2
;quit ;
data output ;
  set a1(keep=&commvarnames) ;  
  array one(&commoncount) _temporary_ ;
  array two(&commoncount) &commvarnames ;

  * Load A1 to temporary array ;
  do i=1 to &commoncount ;
    one(i)=two(i) ;
  end ;

  * Load A2 to variables ;
  set a2(keep=&commvarnames) ;  

  do i=1 to &commoncount ;
    product=sum(product,one(i)*two(i)) ;
  end ;
run ;