两个数据集中公共变量的乘积
product of common variables in two datasets
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
中有很多共同的列(不同值的数字列)。我想计算 Value
作为那些公共列的 'sumproduct'。
我尽量避免像a.common1 * b.common1 + a.common2 * b.common2 + ...
这样的事情
要使其动态化需要相当多的代码。我会这样分解它:
- 获取每个数据集中存在的变量列表
- 合并列表以获得公共变量列表
- 将其输入数据步骤中的一些数组逻辑
稍后会 post 一些代码,但希望这足以给您一些想法。
据我所知需要一些预处理步骤....
加载您的数据:
data a1 ;
input a b c ;
cards ;
2 3 4
1 2 3
;run ;
data a2 ;
input a b d ;
cards ;
0 0.3 1
0 0.2 0
;run ;
提取 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 ;
将公共变量的列表和计数都放入宏变量中:
proc sql ;
select name
into :commvarnames separated by ' '
from data2
;
select count(name)
into :commoncount
from data2
;quit ;
读取源数据集 - 加载第一个数据集,将它们传输到临时数组(因此它们不会覆盖变量值),然后加载第二个数据集并在 do 循环中进行计算:
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 ;
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
中有很多共同的列(不同值的数字列)。我想计算 Value
作为那些公共列的 'sumproduct'。
我尽量避免像a.common1 * b.common1 + a.common2 * b.common2 + ...
要使其动态化需要相当多的代码。我会这样分解它:
- 获取每个数据集中存在的变量列表
- 合并列表以获得公共变量列表
- 将其输入数据步骤中的一些数组逻辑
稍后会 post 一些代码,但希望这足以给您一些想法。
据我所知需要一些预处理步骤....
加载您的数据:
data a1 ;
input a b c ;
cards ;
2 3 4
1 2 3
;run ;
data a2 ;
input a b d ;
cards ;
0 0.3 1
0 0.2 0
;run ;
提取 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 ;
将公共变量的列表和计数都放入宏变量中:
proc sql ;
select name
into :commvarnames separated by ' '
from data2
;
select count(name)
into :commoncount
from data2
;quit ;
读取源数据集 - 加载第一个数据集,将它们传输到临时数组(因此它们不会覆盖变量值),然后加载第二个数据集并在 do 循环中进行计算:
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 ;