Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 宏循环变量并存储结果_Sas_Sas Macro - Fatal编程技术网

Sas 宏循环变量并存储结果

Sas 宏循环变量并存储结果,sas,sas-macro,Sas,Sas Macro,我有以下变量:A_Bldg B_Bldg C_Bldg D_Bldg。我想将它们乘以INTSF,并将结果存储在一个新变量Sale\u I中。例如,A_Bldg*INTSF=Sale_A,B_Bldg*INTSF=Sale_B,等等 我的代码是: %macro loopit(mylist); %let n=%sysfunc(countw(&mylist)); %do J = 1 %to &n; %let i = %scan(&mylist,&J); data

我有以下变量:
A_Bldg B_Bldg C_Bldg D_Bldg
。我想将它们乘以
INTSF
,并将结果存储在一个新变量
Sale\u I
中。例如,
A_Bldg*INTSF=Sale_A
B_Bldg*INTSF=Sale_B
,等等

我的代码是:

%macro loopit(mylist);
%let n=%sysfunc(countw(&mylist));
%do J = 1 %to &n;
%let i = %scan(&mylist,&J);

  data test;
  set data;
  sale_&i. = &i._Bldg * INTSF;
  run;

%end;
%mend;

%let list = A B C D;
%loopit(&list);

这只会生成列表中的最后一个字母
Sale\u D
。如何显示
Sales A-C
?前四行代码是这样的,我可以循环阅读文本A-D。我曾想过使用数组,但不知道如何根据A-D指标选择变量。谢谢你的帮助

您当前在列表中循环,每次都重新创建
测试
数据集,因此它似乎只有
销售
,因为您只查看最后一次迭代

您可以通过在一个数据步骤中扫描列表来清理循环,以解决问题:

%let list = A B C D;

%macro loopit;

    data test;
        set data;
            %do i = 1 %to %sysfunc(countw(&list.));
            %let this_letter = %scan(&list., &i.);
                sale_&this_letter. = &this_letter._Bldg * INTSF;
            %end;
    run;

%mend loopit;

%loopit;

您当前正在循环浏览列表并每次重新创建
测试
数据集,因此它似乎只有
销售
,因为您只查看最后一次迭代

您可以通过在一个数据步骤中扫描列表来清理循环,以解决问题:

%let list = A B C D;

%macro loopit;

    data test;
        set data;
            %do i = 1 %to %sysfunc(countw(&list.));
            %let this_letter = %scan(&list., &i.);
                sale_&this_letter. = &this_letter._Bldg * INTSF;
            %end;
    run;

%mend loopit;

%loopit;

您的
%DO
循环位于错误的位置。但实际上,您不需要使用宏代码来执行本机SAS代码已经可以执行的操作

data want;
  set have ;
  array in A_Bldg B_Bldg C_Bldg D_Bldg ;
  array out sale_1-sale4 ;
  do i=1 to dim(in);
    out(i)=intsf*in(i);
  end;
run;

您的
%DO
循环位于错误的位置。但实际上,您不需要使用宏代码来执行本机SAS代码已经可以执行的操作

data want;
  set have ;
  array in A_Bldg B_Bldg C_Bldg D_Bldg ;
  array out sale_1-sale4 ;
  do i=1 to dim(in);
    out(i)=intsf*in(i);
  end;
run;