楼主: 白塔湖123
3008 7

请教一个sas中macro的问题 感谢! [推广有奖]

  • 2关注
  • 6粉丝

副教授

98%

还不是VIP/贵宾

-

威望
0
论坛币
22348 个
通用积分
3.8531
学术水平
3 点
热心指数
20 点
信用等级
3 点
经验
5264 点
帖子
284
精华
0
在线时间
1668 小时
注册时间
2012-9-20
最后登录
2024-4-25

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
图片1 图片2
大家好,

我想请教一个sas问题,我有一组数据如图1所示,对于每个股票代码,每一年都有一个序号gp。我想在这个表后面加一列trdmnt。比如000001,1996,对应的gp=4 我希望能把这行加一列,把这个year=1996对应的gp序号用于199607-199706.

请问一下这个有没有办法写一个macro来实现?

说白了就是对每只股票我在每年7月做了一个排序,但是我想把这个排序序号给保留12个月,12个月之后再重新进行排序。

图片2是我希望得到的数据集的样子。

由于第一张图中每年的股票数量是变化的,所以很难先生成stkcd和trdmnt的序列,再merge回去。还是比较希望从图片1出发来写个macro,把排序序号保留12个月来实现。

请高手不吝赐教!感谢!

如果程序可行的话我可以给大家论坛币,这都没问题的。谢谢大家!

二维码

扫码加我 拉你入群

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

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

关键词:Macro acr CRO Mac Merge 股票代码 图片

回帖推荐

yingzi2003 发表于6楼  查看完整内容

程序已经改好, 因为你的year是数字型, 只要改成字符型就可以. data one (drop=i j) ; set templib.statement7 ; length tvdmnt $12 ; do i=1 to 12 ; if i
沙发
yingzi2003 发表于 2016-5-11 04:51:20 |只看作者 |坛友微信交流群
data one (drop=i j) ;
  set orig ;
  length tvdmnt $12 ;
  do i=1 to 12 ;
         if i<=6 then j=i+6 ;
         else j=i-6;
         tvdmnt = trim(year)||'-'|| put(j,z2.) ;
         output ;
  end ;
run ;
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
admin_kefu + 15 + 2 + 2 热心帮助其他会员

总评分: 论坛币 + 15  学术水平 + 2  热心指数 + 2   查看全部评分

使用道具

藤椅
l1i2n3i4n5g 在职认证  发表于 2016-5-11 10:03:03 |只看作者 |坛友微信交流群
  1. data a;
  2. input stkcd $ year gp;
  3. cards;
  4. 000001 1996 4
  5. 000001 1997 3
  6. 000001 1998 3
  7. ;
  8. run;

  9. data b;
  10. input trdmnt $;
  11. cards;
  12. 1996-07
  13. 1996-08
  14. 1996-09
  15. 1996-10
  16. 1996-11
  17. 1996-12
  18. 1997-01
  19. 1997-02
  20. 1997-03
  21. 1997-04
  22. 1997-05
  23. 1997-06
  24. ;
  25. run;

  26. proc sql;
  27.         create table c as select * from a cross join b;
  28. quit;
复制代码
已有 2 人评分经验 论坛币 热心指数 收起 理由
eijuhz + 5 热心帮助其他会员
admin_kefu + 20 + 2 热心帮助其他会员

总评分: 经验 + 5  论坛币 + 20  热心指数 + 2   查看全部评分

使用道具

板凳
白塔湖123 发表于 2016-5-11 11:07:50 |只看作者 |坛友微信交流群
yingzi2003 发表于 2016-5-11 04:51
data one (drop=i j) ;
  set orig ;
  length tvdmnt $12 ;
您好,非常感谢您的回复。

但是我运行了您的程序之后,如图所示。生成的tvdmnt并没有把year和 j 合并起来形成1996-07的这种字符形式,可以再帮我看看是哪里出了问题吗?  附件的zip文件中我也给出了我要处理的原始sas数据集,可不可以请您方便时候再帮我看一下?谢谢!

111.png 数据.zip (447.4 KB)

使用道具

报纸
dogmamongo 发表于 2016-5-11 14:40:12 |只看作者 |坛友微信交流群
白塔湖123 发表于 2016-5-11 11:07
您好,非常感谢您的回复。

但是我运行了您的程序之后,如图所示。生成的tvdmnt并没有把year和 j 合并起 ...
主要是你应该把trdmnt转换成数字格式
而不是沿用国泰安里面最初的字符格式
不然 建投资组合的研究
完全不需要再做这样的动作
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

使用道具

地板
yingzi2003 发表于 2016-5-11 23:57:55 |只看作者 |坛友微信交流群
程序已经改好, 因为你的year是数字型, 只要改成字符型就可以.

data one (drop=i j) ;
   set templib.statement7 ;
   length tvdmnt $12 ;
   do i=1 to 12 ;
          if i<=6 then j=i+6 ;
          else j=i-6;
          tvdmnt = put(year,4.)||'-'|| put(j,z2.) ;
          output ;
   end ;
run ;
已有 1 人评分经验 收起 理由
eijuhz + 5 热心帮助其他会员

总评分: 经验 + 5   查看全部评分

使用道具

7
白塔湖123 发表于 2016-5-12 12:15:23 |只看作者 |坛友微信交流群
yingzi2003 发表于 2016-5-11 23:57
程序已经改好, 因为你的year是数字型, 只要改成字符型就可以.

data one (drop=i j) ;
感谢!!!

使用道具

8
ff4uhajb 发表于 2016-5-13 11:20:21 |只看作者 |坛友微信交流群
白塔湖123 发表于 2016-5-11 11:07
您好,非常感谢您的回复。

但是我运行了您的程序之后,如图所示。生成的tvdmnt并没有把year和 j 合并起 ...
format需要转换成字符在进行拼接

使用道具

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

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

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

GMT+8, 2024-5-1 05:01