楼主: dxystata
4643 18

如何将第1列变量非缺失值所在行的上一行赋值为T [推广有奖]

11
huangpengfei 发表于 2014-11-2 22:13:44
farmman60 发表于 2014-11-1 10:38
这个方法简单!厉害

12
dxystata 发表于 2014-11-4 13:40:54
pobel 发表于 2014-11-2 10:36
不用data步的话,我实现不了。
proc sql noprint;
   select  (^missing(var))*(monotonic()-1) into:t ...
proc sql noprint;
   select  (^missing(var))*(monotonic()-1) into:tobs separated by "*"
     from aaa1;
quit;

如何只把5和11 放入宏变量中?谢谢!

13
pobel 在职认证  发表于 2014-11-4 14:54:44
dxystata 发表于 2014-11-4 13:40
proc sql noprint;
   select  (^missing(var))*(monotonic()-1) into:tobs separated by "*"
     fro ...
如果是用SQL INTO的话,我觉得不能直接选出5 和11,只能是SQL运行完后,把值里面的0去掉

14
dxystata 发表于 2014-11-4 15:19:34
pobel 发表于 2014-11-4 14:54
如果是用SQL INTO的话,我觉得不能直接选出5 和11,只能是SQL运行完后,把值里面的0去掉
如何把0去掉呢?

15
dxystata 发表于 2014-11-4 16:06:29
farmman60 发表于 2014-11-1 10:38
如何将第1列变量非缺失值所在行的上一行的行号放入宏变量呢?

16
farmman60 发表于 2014-11-4 22:51:46
dxystata 发表于 2014-11-4 16:06
如何将第1列变量非缺失值所在行的上一行的行号放入宏变量呢?
  1. data aaa1;
  2. infile cards missover;
  3. input var $ x1 $ y2;
  4. cards;
  5. a aa 1
  6. . .  2
  7. . bb 1
  8. . .  2
  9. . cc 1
  10. b aa 1
  11. . .  2
  12. . bb 1
  13. . .  2
  14. . cc 1
  15. . cc 2
  16. c aa 1
  17. . .  2
  18. . bb 1
  19. . .  2
  20. ;
  21. run;

  22. data _null_;
  23.   do i=1 to tot;
  24.     set aaa1(keep=var) point=i nobs=tot;
  25.         array temp[10000] $;
  26.     temp(i)=var;
  27.   end;
  28.   do  i=1 to tot;
  29.     set aaa1  point=i nobs=tot;
  30.     if missing(var) and not missing(temp(i+1)) then call symput('tag'||(left(i)),i);
  31.   end;
  32.   stop;
  33. run;


  34. %put _user_;
复制代码
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 50 + 3 + 3 观点有启发

总评分: 经验 + 50  学术水平 + 3  热心指数 + 3   查看全部评分

17
dxystata 发表于 2014-11-5 09:50:49
farmman60 发表于 2014-11-4 22:51
有没办法将5 11 放入一个宏变量中,以空格分隔。谢谢!

18
pobel 在职认证  发表于 2014-11-5 10:12:26
dxystata 发表于 2014-11-4 15:19
如何把0去掉呢?
%let tobs=%sysfunc(compress(%sysfunc(tranwrd(*&tobs,*0,%str()))  ));

还是data步简单:
data _null_;
    set aaa1(keep=var) end=last;
        length tmp $20;
        retain tmp;
        if ^missing(var) and _n_ ne 1 then tmp=catx(" ",tmp,_n_-1);
        if last then call symputx("tmp",tmp);
run;

%put &tmp;
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 3 + 3 分析的有道理

总评分: 经验 + 100  学术水平 + 3  热心指数 + 3   查看全部评分

19
yongyitian 发表于 2014-11-5 13:16:54
dxystata 发表于 2014-11-5 09:50
有没办法将5 11 放入一个宏变量中,以空格分隔。谢谢!
/* 也可以不用宏变量 */
data _null_;
   set aaa1 end = last;
    length tag $20;
    retain tag " ";
    if ^missing(var) and _n_ ^=1 then do;
     n = _n_ -1;
    tag = catx(' ', tag, put(n, 2.)); end;
    if last then  do;
   * call symput('tag', tag);
   * call execute('Data bbb1; set aaa1; if _n_ in( ' ||'&tag' || ')  then var= "T"; run;');  
     call execute('Data bbb2; set aaa1; if _n_ in( ' ||tag|| ')  then var= "T"; run;');  
    end;
run;


/* 另一种方法,只用数据步 */
data ddd1;
   do I = Nobs to 1 by -1;
     set aaa1 nobs=nobs point = i;
     if ^missing(lag(var)) and var ^="T" then var="T";
     output;
   end; stop;
run;
data ddd2;
   do p = Nobs to 1 by -1;
     set ddd1 nobs=nobs point = p;
     output;
   end; stop;
run;
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 50 + 2 + 3 分析的有道理

总评分: 经验 + 50  学术水平 + 2  热心指数 + 3   查看全部评分

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

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