楼主: 陶然
3139 7

求助:如何把循环宏变量i转换成年份(数值型)和月份 [推广有奖]

  • 1关注
  • 3粉丝

已卖:6份资源

讲师

82%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
7.5000
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
3315 点
帖子
186
精华
0
在线时间
1002 小时
注册时间
2005-9-11
最后登录
2025-5-6

楼主
陶然 发表于 2013-8-24 18:03:36 |AI写论文
1论坛币
我要做48次循环,对应2009.1——2012.12共48个月,在循环中我需要&年份和&月份,因此我需要将i ——>a=年份 b=月份
具体如下:
i         yr        mnth
1      2009    1
13    2010    1
...
我编了循环如下:
%macro xdata;
%do j=1 to 48;
%let yr=int(input(&j)/12));                //我尝试将 i 转换为年份和月份
%let mnth=&j-12*yr;
data datatemp;
set datam;
if year>=&yr and month>=&mnth then delete;  //这里我引用到了年份和月份
run;
%mend;
%xdata
这样编有两个问题:1.上面我的尝试被拒绝了 2.即便宏变量赋值成功,我怀疑这两个变量是字符型的,无法进行大小比较
期待任何评论和建议!

易丹 2013-08-24

关键词:数值型 delete datat Macro month 如何

沙发
312683649 发表于 2013-8-24 18:24:15
不会呀
http://www.xszhb.com
http://ksxx.xszhb.com

藤椅
gongxun1234 发表于 2013-8-24 23:51:05
你把你的要求写明白些  或者我可以帮到你 你是要将数据集中的年份与月份与循环中的年份月份比较?

板凳
tangliang0905 发表于 2013-8-25 11:57:45
不是很明白你需要的是什么,
第一个是你的do语句没有end语句,

第二个我猜是你想生成48个data,那样的话,连datatemp都要加上datatemp&j


%macro xdata;
%do j=1 to 48;
%let yr=int(input(&j)/12));                //我尝试将 i 转换为年份和月份
%let mnth=&j-12*yr;
data datatemp;
set datam;
if year>=&yr and month>=&mnth then delete;  //这里我引用到了年份和月份
run;
%mend;
%xdata

报纸
陶然 发表于 2013-8-25 16:29:14
gongxun1234 发表于 2013-8-24 23:51
你把你的要求写明白些  或者我可以帮到你 你是要将数据集中的年份与月份与循环中的年份月份比较?
在一个总数据的excel里面有2008年1月到2012年12月的所有数据,变量有年份和月份(皆为num.),我想用每次循环i指代从2009年1月开始算的第i个月,以i=1为例,指代2009年1月,在这次循环中我要删除2009年1月之后的所有观测,形成一个新的数据集,因此需要把宏变量i生成新变量year 和month。
不知道说明白了不?

地板
陶然 发表于 2013-8-25 16:31:52
tangliang0905 发表于 2013-8-25 11:57
不是很明白你需要的是什么,
第一个是你的do语句没有end语句,
对第二个问题,嗯,我不需要生成48个数据集,事实上我需要把每次循环处理过后的数据集合并,所以只要两个数据集做中间过渡用

7
tangliang0905 发表于 2013-8-26 01:10:19
看上去中间data就是选取当前时间内的data,然后最后拼装在一起。所以可不可以这样理解,第一个月2009年1月的data,要出现48次,然后2月的data出现47次?事实上你已经有两个year和month的列了,

8
陶然 发表于 2013-8-26 10:22:07
我仔细研究了宏函数,解决了问题
%do j=1 %to 48;
%let yr=%sysfunc(putn(2008+ %sysfunc(ceil(%sysfunc(inputn(&j,2.))/12)) ,4.));
%let mnth=%sysfunc(putn(%sysfunc(inputn(&j,4.))+12-12*%sysfunc(ceil(%sysfunc(inputn(&j,4.))/12)) ,2.));

year > %sysfunc(inputn(&yr,4.))
欢迎批评指正。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 21:11