楼主: kaola671
3673 9

如何设置多个宏参数 [推广有奖]

  • 0关注
  • 0粉丝

高中生

27%

还不是VIP/贵宾

-

威望
0
论坛币
2 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
136 点
帖子
5
精华
0
在线时间
42 小时
注册时间
2015-8-24
最后登录
2022-9-25

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
情况如下: 我在处理一些城市的电力数据, 包含用电量, 气温 等多个指标,我需要提取出每个城市的每个指标的max, min , mean值, 最后合并汇总到一个数据集里,目标效果如下:

consuming amount

temperature

citymaxminmeanmax minmean
beijing
shanghai
tianjin
.
.
.
因为有多个城市的多个指标,所以我想用宏函数,目前想法是设置两个宏函数,参数分别为city 和 index 。中间程序涉及变量 &city._&index ,最后显示无法调用。想知道版上大神有什么好的思路来解决这个问题?谢谢啦
二维码

扫码加我 拉你入群

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

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

关键词:Beijing TIANJIN amount Index Haiti 如何

沙发
SunnyIving 发表于 2015-8-24 13:40:29 |只看作者 |坛友微信交流群
上代码

使用道具

藤椅
kaola671 发表于 2015-8-24 14:41:25 |只看作者 |坛友微信交流群
SunnyIving 发表于 2015-8-24 13:40
上代码
PROC IMPORT OUT= WORK.work1
            DATAFILE= "work1.csv"
            DBMS=CSV REPLACE;
     GETNAMES=YES;
     DATAROW=2;
RUN;

%macro city_func(city);
%macro index_func(index);
data &city.;
set work1(keep =time  &city._&index.  where= (&city._&index.<>.));
run;

/*选出最近的三个值*/
proc sort data= &city.;
by descending time ;
run;

data  &city.1;
set  &city.(obs=3  keep=time   &city._&index.);
/*input  label $8.;*/
/*cards;*/
/*recent1*/
/*recent2  */
/*recent3*/
/*;*/
run;

proc transpose data= &city.1 out= &city.1;
/*id label;*/
var  &city._&index.;
run;

/*选出最大最小值*/
proc sql;
create table  &city.2 as
select max( &city._&index.) as max_value, min( &city._&index.) as min_value
from  &city.;
quit;

/*合并五个子变量*/
data  &city.;
length city  $25.;
city=" &city.";
merge  &city.1   &city.2;
run;


data total;
set total  &city.;
run;

%mend;
%mend ;

%index_func(price)
%index_func(revenue)
%index_func(sales)
%index_func(..)
%index_func(..)


%city_func(beijing)
%city_func(tianjin)
%city_func(shijiazhuang)
%city_func(taiyuan)
%city_func(huhehaote)
%city_func(shenyang)
........

使用道具

板凳
忍冬的秋 发表于 2015-8-24 16:47:14 |只看作者 |坛友微信交流群
是不是这样啊
如果原始表 是 这个样子
city consuming_amount temperature ...
设置该原始表 名称为raw_table
%let var=
consuming_amount
temperature
;/*这里指标 可以随意添加,可以用proc contents获得指标变量的名称*/

%macro change(indata=,outdata=);
proc sort data=work.&indata. out=work.temp;
by city;
run;

data _null_;
array abc{*} &var.;
call symput("var_len",dim(abc));
run;

proc means data =work.temp;
by city;
var
%do i=1 %to &var_len.;
%scan(&var.,&i.)
%end;
;
output out=&outdata.
%do i=1 %to &var_len.;
mean(%scan(&var.,&i.))=%scan(&var.,&i.)_mean
max(%scan(&var.,&i.))=%scan(&var.,&i.)_max
min(%scan(&var.,&i.))=%scan(&var.,&i.)_min

%end;
;
run;
%mend change;

%change(indata=work.raw_table,out=work.final);

使用道具

报纸
忍冬的秋 发表于 2015-8-24 16:47:54 |只看作者 |坛友微信交流群
能否上传个原始表?

使用道具

地板
kaola671 发表于 2015-8-24 16:57:15 |只看作者 |坛友微信交流群
忍冬的秋 发表于 2015-8-24 16:47
能否上传个原始表?
timebeijing_consuming amountshanghai_consuming amount.......beijing_temperatureshanghai_temperature....
2001/1/1
2002/1/1
2003/1/1
2004/1/1
2005/1/1
2006/1/1
2007/1/1
2008/1/1
2009/1/1
.....
                                          
抱歉啊,之前没有上原始表 。原始表是类似上面那个样子的。

使用道具

7
Tigflanker 发表于 2015-8-24 17:25:08 |只看作者 |坛友微信交流群
%macro city_and_index_func(city = , index = );
嘟嘟嘟。。
set work1(keep =time  &city._&index.  where= (&city._&index.<>.));
嘟嘟嘟。。
%mend;

%city_and_index_func(city = beijing, index = temperature);

把北京的电费算低点就靠你了,兄弟
推荐函数:floor,int等
你算PM2.5吗,用这个:ceil,max ...

使用道具

8
忍冬的秋 发表于 2015-8-25 08:49:15 |只看作者 |坛友微信交流群
data work.a;
infile "C:\360Downloads\new_qs.csv" missover dsd firstobs=2;
input time : $20. beijing_consumingamount shanghai_consumingamount beijing_temperature shanghai_temperature;
run;
proc transpose data=a out=b;
var _numeric_;
id time;
run;

data final(keep=city zhibiao value);
set work.b;
array abc{*} _numeric_;
do i=1 to dim(abc);

city=scan(_name_,1,'_');
zhibiao=scan(_name_,2,'_');
value=abc[i];
output;

end;
run;
proc sort data=final out=work.c;
by city zhibiao;
run;
proc means data=c noprint;
by city zhibiao;
var value;
output out=work.d mean=mean_value max=max_value min=min_value;
run;

使用道具

9
忍冬的秋 发表于 2015-8-25 08:52:48 |只看作者 |坛友微信交流群
new_qs.xlsx (9.29 KB)

使用道具

10
忍冬的秋 发表于 2015-8-25 08:54:58 |只看作者 |坛友微信交流群
忍冬的秋 发表于 2015-8-25 08:52
consumingamount中间最好不要加空格 不然会认为 是两个变量 或者你用proc import导入也可以

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 22:29