SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1024|回复: 7
打印 上一主题 下一主题

求助sas 一列中0之间取最大值

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-5-4 13:53:01 | 只看该作者

求助sas 一列中0之间取最大值

求助在sas 里如何在一列中 0中间取最大值
0
1
2
3
0
0
1
2
0
中间取最大值3、2
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-5-4 21:17:21 | 只看该作者

Re: 求助sas 一列中0之间取最大值

[code:1xg7lvld]data a;
input x@@; datalines;
0 1 3 2 0 0 1 2 0
;
data b;
        set a;
        if x = 0 then n+1;
run;
data c;
        do until(last.n);
                set b;         by n;
                if x > y then y = x;
        end;
        do until(last.n);
                set b;         by n;
                z = ifn(x ^= 0, y, 0);
                output;
        end;
        drop n y;
run;[/code:1xg7lvld]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-5-5 22:05:08 | 只看该作者

Re: 求助sas 一列中0之间取最大值

谢谢 jingju11 , 解决了我的问题,高手阿
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-5-6 08:24:29 | 只看该作者

Re: 求助sas 一列中0之间取最大值

to jingju11, why not do it within one pass of the data?

a simple retain works:
[code:3heasua2]
data a;
input x@@; datalines;
0 1 3 2 0 0 1 2 0
;
run;

data b;
       set a;
       retain zero 0;
       retain maxi  -9999999;
       if x^=0 then maxi=max(maxi, x);
      else do;            
            if mod(zero, 2)=1 then output;
            keep maxi;
           maxi=-constant('BIG'); zero+1;
    end;
run;
[/code:3heasua2]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-5-6 16:50:27 | 只看该作者

Re: 求助sas 一列中0之间取最大值

搅和一下
[code:j2t4m8zg]data b(keep=max);
        set a end=last ;
        retain Max;
        if x+lag(x)=0 or last then output;
        max=ifn(x+lag(x),max(x,max),x);
run;[/code:j2t4m8zg]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-5-6 21:03:08 | 只看该作者

Re: 求助sas 一列中0之间取最大值

you are right. both of your codes are much more concise than mine. on the other hand, the outputs are slight different.
[u:13i06l6r]yours[/u:13i06l6r]
Obs    Max
1      3
2      2

[u:13i06l6r]mine[/u:13i06l6r]
Obs    x    z
1     0    0
2     1    3
3     3    3
4     2    3
5     0    0
6     0    0
7     1    2
8     2    2
9     0    0
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-5-16 22:59:21 | 只看该作者

Re: 求助sas 一列中0之间取最大值

按理来说jingju的code更适用,这个好像可用于挑出连续信号峰中的峰值。

另外一种情况:
[code:16tujca3]data a ;
input x;
cards;
0
1
2
3
0
0
0
1
2
0
1
3
2
0
;
run;
data ex;
  set a;
  if x=lag(x)+x and x^= 0 then n+1;
  run;
proc transpose data=ex(firstobs=2) out=ex2 prefix=n;
by n;
run;
data  ex2(keep=n max);
set ex2;
max=max(of n:);
run;
proc print;
run;[/code:16tujca3]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-5-17 09:58:12 | 只看该作者

Re: 求助sas 一列中0之间取最大值

好啊
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 06:46 , Processed in 0.087687 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表