楼主: 小鳄鱼a
1639 10

求助补齐观测 [推广有奖]

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

楼主
小鳄鱼a 发表于 2015-11-1 19:49:52 |AI写论文
150论坛币
想把观测补齐    一种是按照起始时间   

第二种是给定一个结束的时间   比如1998 1

请下载   例子   文件啊    不要下载另一个了

exampleb1.xlsx
下载链接: https://bbs.pinggu.org/a-1906662.html

8.72 KB

需要: 200 个论坛币  [购买]

例子.xlsx

8.8 KB

最佳答案

木叶知秋 查看完整内容

生成连续的季度时间啊 first.name时候的qtr就是开始时间,从开始时间循环到你要的结束时间,循环一次输出一条

沙发
木叶知秋(未真实交易用户) 发表于 2015-11-1 19:49:53
小鳄鱼a 发表于 2015-11-2 14:21
谢谢  能否解释下这段啊
生成连续的季度时间啊
first.name时候的qtr就是开始时间,从开始时间循环到你要的结束时间,循环一次输出一条

藤椅
木叶知秋(未真实交易用户) 发表于 2015-11-2 00:26:54
不知道有没更好的方法
  1. data rawdata;
  2. input name$ year qtr var var1$;
  3. qtr2=yyq(year,qtr);
  4. format qtr2 yyq6.;
  5. cards;
  6. a        1996        3        2        or
  7. a        1996        4        3        or
  8. a        1997        1        6        or
  9. a        1997        4        9        or
  10. b        1995        1        7        ob
  11. b        1996        1        6        ob
  12. ;
  13. run;

  14. proc sort data=rawdata;
  15. by name qtr2;
  16. run;

  17. **取开始和结尾时间;
  18. data test;
  19.         set rawdata;
  20.         retain begin_qtr;
  21.         by name;
  22.         if first.name then begin_qtr=qtr2;
  23.         if last.name then do; end_qtr=qtr2; output;end;
  24.         keep name begin_qtr end_qtr var1;
  25.         format begin_qtr end_qtr yyq6.;
  26. run;

  27. **生成连续时间数据集;
  28. data test2;
  29.         set test;
  30.         con_qtr=intnx('qtr',begin_qtr,-1);       
  31.         do until(con_qtr=end_qtr);
  32.                 con_qtr=intnx('qtr',con_qtr,1);
  33.                 output;
  34.         end;
  35.         format con_qtr yyq6.;
  36.         drop begin_qtr end_qtr;
  37. run;

  38. **合并;
  39. data test3;
  40.         merge test2(rename=(con_qtr=qtr2)) rawdata(keep=name qtr2 var);
  41.         by name qtr2;
  42.         year=year(qtr2);
  43.         qtr=qtr(qtr2);
  44.         drop qtr2;
  45. run;
复制代码

板凳
小鳄鱼a(未真实交易用户) 发表于 2015-11-2 08:45:57
木叶知秋 发表于 2015-11-2 00:26
不知道有没更好的方法
谢谢     如果 对所有name给定一个结束的时间   比如1998 1  该怎么写呢

报纸
木叶知秋(未真实交易用户) 发表于 2015-11-2 10:42:59
小鳄鱼a 发表于 2015-11-2 08:45
谢谢     如果 对所有name给定一个结束的时间   比如1998 1  该怎么写呢
那就更简单了 你把end_qtr改成1998Q1就行了
  1. data rawdata;
  2. input name$ year qtr var var1$;
  3. qtr2=yyq(year,qtr);
  4. format qtr2 yyq6.;
  5. cards;
  6. a        1996        3        2        or
  7. a        1996        4        3        or
  8. a        1997        1        6        or
  9. a        1997        4        9        or
  10. b        1995        1        7        ob
  11. b        1996        1        6        ob
  12. ;
  13. run;

  14. proc sort data=rawdata;
  15. by name qtr2;
  16. run;

  17. **生成连续时间数据集;
  18. data test;
  19.         set rawdata;
  20.         by name;
  21.         if first.name then do;
  22.                         con_qtr=intnx('qtr',qtr2,-1);        
  23.                 do until(con_qtr=yyq(1998,1));
  24.                         con_qtr=intnx('qtr',con_qtr,1);
  25.                         output;
  26.                 end;
  27.                 end;
  28.                 format con_qtr yyq6.;
  29.                 keep name con_qtr var1;
  30. run;


  31. **合并;
  32. data test2;
  33.         merge test(rename=(con_qtr=qtr2)) rawdata(keep=name qtr2 var);
  34.         by name qtr2;
  35.         year=year(qtr2);
  36.         qtr=qtr(qtr2);
  37.         drop qtr2;
  38. run;
复制代码

地板
小鳄鱼a(未真实交易用户) 发表于 2015-11-2 14:21:28
木叶知秋 发表于 2015-11-2 10:42
那就更简单了 你把end_qtr改成1998Q1就行了
谢谢  能否解释下这段啊   


    if first.name then do;
                        con_qtr=intnx('qtr',qtr2,-1);        
                do until(con_qtr=yyq(1998,1));
                        con_qtr=intnx('qtr',con_qtr,1);
                        output;
                end;
                end;

7
小鳄鱼a(未真实交易用户) 发表于 2015-11-2 15:25:12
木叶知秋 发表于 2015-11-2 10:42
那就更简单了 你把end_qtr改成1998Q1就行了
这个是怎么保证加一个季度或者年的呢    有没有i=i+1之类的   

                do until(con_qtr=yyq(1998,1));
                        con_qtr=intnx('qtr',con_qtr,1);
                        output;

8
木叶知秋(未真实交易用户) 发表于 2015-11-2 15:32:13
小鳄鱼a 发表于 2015-11-2 15:25
这个是怎么保证加一个季度或者年的呢    有没有i=i+1之类的   

                do until(con_qtr=yyq ...
con_qtr=intnx('qtr',con_qtr,1);就是循环控制语句啊
intnx函数就是把con_qtr每次循环加一个季度

9
小鳄鱼a(未真实交易用户) 发表于 2015-11-2 15:44:19
木叶知秋 发表于 2015-11-2 15:32
con_qtr=intnx('qtr',con_qtr,1);就是循环控制语句啊
intnx函数就是把con_qtr每次循环加一个季度
是不是如果不在循环结构中只有跳到某个日期的功能,在循环结构中就有了循环控制功能

10
木叶知秋(未真实交易用户) 发表于 2015-11-2 16:12:18
小鳄鱼a 发表于 2015-11-2 15:44
是不是如果不在循环结构中只有跳到某个日期的功能,在循环结构中就有了循环控制功能
就是用跳到某个日期的功能  循环控制语句不是只有i+1这种
这里的退出循环条件是con_qtr=yyq(1998,1),con_qtr每次增加一个季度,到1998Q1就退出循环

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-17 14:21