全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4160 9
2015-08-24
情况如下: 我在处理一些城市的电力数据, 包含用电量, 气温 等多个指标,我需要提取出每个城市的每个指标的max, min , mean值, 最后合并汇总到一个数据集里,目标效果如下:

consuming amount

temperature

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

扫码加我 拉你入群

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

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

全部回复
2015-8-24 13:40:29
上代码
二维码

扫码加我 拉你入群

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

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

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
能否上传个原始表?
二维码

扫码加我 拉你入群

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

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

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
.....
                                          
抱歉啊,之前没有上原始表 。原始表是类似上面那个样子的。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群