楼主: fxf258
3741 8

[原创博文] 如何编写求数据集中几个变量的和的宏程序 [推广有奖]

  • 1关注
  • 3粉丝

已卖:2份资源

教授

92%

还不是VIP/贵宾

-

威望
0
论坛币
3486 个
通用积分
31.7841
学术水平
-3 点
热心指数
2 点
信用等级
-3 点
经验
108956 点
帖子
499
精华
0
在线时间
2904 小时
注册时间
2006-11-4
最后登录
2026-1-15

楼主
fxf258 发表于 2012-3-22 03:02:09 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请教各位朋友,如何编写这样的宏程序?
如有一数据集A,其中有n个变量,但事先并不知道有几个变量,现要求生成一个新变量,新变量的值为其中指定的几个变量的和,此程序如何编写?谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:宏程序 数据集 求数据 新变量 不知道 朋友 程序 如何

沙发
wanwanle2 在职认证  发表于 2012-3-22 13:39:16
*首先查看头文件信息,将数据A中的变量放在数据集VariableDat中,其中NAME 这一列就是数据集A中的所有变量;
proc contents data=A noprint out=VariableDat;
run;
*将变量写成宏变量;
proc Sql noprint;
select Name,count(*) into : Var_Name descrite by ' ',Var_count from VariableDat;
quit;
%put &Var_Name. ;
%put &Var_count. ;

*求和;
data New;
set A;
Sum_Var=sum(of &Var_Name.);
run;


希望对你有帮助;

藤椅
baoaibaobao 发表于 2012-3-22 13:56:43
关于楼上代码:
1、中文注释写得很好,好的编程习惯;
2、 descrite by应修改为separated by;
3、Var_count之前应加:。顺便说一下,在执行SQL语句时,会生成自动宏变量&sqlobs表示观测个数,直接使用即可。
4、楼上代码执行之前,首先需要保证数据集A中所有变量为数值变量,如果有字符存在,代码执行失败。

板凳
乾坤神龙 发表于 2012-3-22 16:00:45
很好,对于我这样的初级选手有帮助!!

报纸
fxf258 发表于 2012-3-25 10:57:13
谢谢各位的赐教,出差几天未能查看!
还有些疑问,想请教:如果我写的宏程序格式如下,怎么编写呢?
%macro hc(datain,varname,varS);
...

%mend;
其中datain为数据集名称,varname为需要合并的变量名称,如:a1 a2 a3 a4 等等,但事先并不知道有多少个变量,现要求在数据集datain中生成新变量为a,其值为a1、a2、a3、...的和。
谢谢!
海象

地板
fxf258 发表于 2012-3-25 11:02:10
谢谢各位的赐教,出差几天未能查看!
还有些疑问,想请教:如果我写的宏程序格式如下,怎么编写呢?
%macro hc(datain,varname,varS);
...

%mend;
其中datain为数据集名称,varname为需要合并的变量名称,如:a1 a2 a3 a4 等等,但事先并不知道有多少个变量,现要求在数据集datain中生成新变量为vars,其值为a1、a2、a3、...的和。
谢谢!
海象

7
bobguy 发表于 2012-3-26 03:25:29
fxf258 发表于 2012-3-25 11:02
谢谢各位的赐教,出差几天未能查看!
还有些疑问,想请教:如果我写的宏程序格式如下,怎么编写呢?
%m ...
I think I got what you need.

You have a list of variables that is available at running time. It is stored in mavro variable varname.

for example varname contains a1 a2 a3 ... and you want to define a sum variable as
sumvar=sum(a1,a2,a3,....);

Here is a simple macro which will do it at running time.

For some macro string manipulating you can read my post

'shape' a macro variable into a desired look  

https://bbs.pinggu.org/thread-699918-1-1.html


***********************************************************

data t1;
retain an 1 bnj 2 avf 3 ah 4 a n b c 1;
output;
run;

%macro sum(dsin, dsout, varlist);

   %let sumvar=;

   %let n= %eval(%sysfunc(countc(%cmpres(&varlist),%str( )))+ (%length(&varlist)>0) );

   %do i = 1 %to &n;
     %let cur_var=%scan(&varlist,&i);
     %if &i=1 %then %let sumvar=&sumvar &cur_var;
     %else         %let sumvar=&sumvar , &cur_var;
   %end;

         data &dsout;
            set &dsin;
                sumvar=sum(&sumvar);
         run;
%mend;

option mprint;
%sum(t1, t1out, an bnj avf);
proc print;run;

%sum(t1, t1out, a n b c);
proc print;run;

%let v=an  avf  a  c;
%sum(t1, t1out, &v);
proc print;run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
rdwalk + 1 + 1 + 1 If you are a girl,I love you!If you are

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

8
fxf258 发表于 2012-3-26 21:18:54
非常感谢bobguy的答复,我的需要已经得到圆满答复!
海象

9
gaotao0727 发表于 2012-3-27 19:16:11
学习了~~~
衣带渐宽终不悔,为伊消得人憔悴~~

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-19 09:47