【发布时间】:2019-11-27 00:02:21
【问题描述】:
我正在尝试运行一个代码,该代码应该适用于考虑到不同因素而创建的表。由于这些因素可能超过 1,我决定创建一个宏 %let 来列出它们:
%let list= factor1 factor2 ...;
我想做的是运行代码来使用不同的因素创建这些表。对于每个因素,我使用proc means 计算平均值和标准差,因此我应该在proc means 为每个因素创建的表中包含变量&list._mean 和&list._stddev。该表标记为t2,我需要加入另一个表t1。从 t1 我正在考虑所有变量。
因此,我的主要困难在于 proc sql:
proc sql;
create table new_table as
select t1.*
, t2.&list._mean as mean
, t2.&list._stddev as stddev
from table1 as t1
left join table2 as t2
on t1.time=t2.time
order by t2.&list.
quit;
此代码返回错误,我认为是因为我正在考虑 t2.factor1 factor2,即 t2 仅适用于第一个因素,而不适用于第二个因素。
我期望的是以下内容:
proc sql;
create table new_table as
select t1.*
, t2.factor1._mean as mean
, t2.factor1._stddev as stddev
from table1 as t1
left join table2 as t2
on t1.time=t2.time
order by t2.factor1.
quit;
另一个是factor2。 更新代码:
%macro test_v1(
_dtb
,_input
,_output
,_time
,_factor
);
data &_input.;
set &_dtb..&_input.;
keep &_col_period. &_factor.;
run;
proc sort data = work.&_input.
out = &_input._1;
by &_factor. &_time.;
run;
%put ERROR: 2
proc means data=&_input._1 nonobs mean stddev;
class &_time.;
var &_factor.;
output out=&_input._n (drop=_TYPE_) mean= stddev= /autoname ;
run;
%put ERROR: 3
proc sql;
create table work.&_input._data as
select t1.*
,t2.&_factor._mean as mean
,t2.&_factor._stddev as stddev
from &_input. as t1
left join &_input._n as t2
on t1.&_time.=t2.&_time.
order by &_factor.;
quit;
%mend test_v1;
然后我的问题是如何考虑多个因素,在宏中定义为列表、表的列以及宏中的输入数据(例如:%test(dataset, tablename, list)。
【问题讨论】:
-
即使您修复了语法错误,您的计划也无法奏效。您不能将 FACTOR1_MEAN 和 FACTOR2_MEAN 重命名为相同的名称。
-
我认为你可以使用一步(proc 排序)而不是两步(data+proc 排序):
proc sort data = have1(keep=time factor1) out = have3_1; by factor1 time; run;而不是data data have2; set have1; keep time factor1; run; proc sort data = have2 out = have2_1; by factor1 time; run; -
为什么你的宏引用了一个完全未定义的宏变量
_col_period?为什么要按“因子”变量而不是 TIME 排序?您是使用 FACTOR 变量作为分析变量还是分组变量?
标签: sas