SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1250|回复: 10
打印 上一主题 下一主题

新手请教一个数据步问题,多多指教,谢谢

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-12-23 18:29:17 | 只看该作者

新手请教一个数据步问题,多多指教,谢谢

我的数据集里有好多类似下面的行,主要有3个column,  "number"  "type" and "control"
one           A                N
one           B                Y
one           C                N
one           D                Y

two           E                N
two           F                N
two           D                N
two           Z                N

其实我只想要对应一个number有一条数据输出, 当control里有多于一个Y的时候就输出 one   Y ,当control里没有一个Y的时候就输出  two                          N

就是说例子里我想要的输出应该如下
one                           Y
two                           N

小弟请问各位有什么比较快的方法可以实现呢,现谢谢你们的解答,希望能共同进步哈
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-12-23 19:07:24 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

[code:20ouiyn7]data raw;
        input number $ type $ control $;
datalines;
one A N
one B Y
one C N
one D Y
two E N
two F N
two D N
two Z N
;

data temp(drop=type temp);
        temp='N';
        do _n_=1 by 1 until(last.number);
                set raw;
                by number;
                temp=ifc(upcase(control)='Y','Y',temp);
        end;
        control=temp;
run;[/code:20ouiyn7]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-12-24 15:54:55 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

谢谢hopewell的解答,学到东西了,另外联想到一个相关的问题,就是可不可以设置优先级来挑选数据呢?

one   A    Y
one   B    Y
one   C    Y
one   D    N

对变量TYPE设置优先级 A<B<C<D, 尽管A,B和C 都是Y,只要D 是N ,最后结果就是N

就是说例子里怎样设置优先级输出才如下
one     N


期待大家的建议啊...
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-12-24 18:13:32 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

[code:1tjt6eae]data raw;
   input number $ type $ control $;
datalines;
one A Y
one B Y
one C Y
one D N
two E Y
two F N
two D N
;

data temp(drop=type);
        set raw;
        by number;
        if last.number then output;
run;[/code:1tjt6eae]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-12-24 23:39:52 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

这个不是只是取最后一行的数据嘛,并没有用到优先级的吧

one A Y
one B Y
one D N
one C Y

如果数据行的顺序变换一样,结果不就不对了吗?能不能先检查D的control值,如果是Y就输出,然后就结束程序,如果是N 就接着检查C的control值,如果C的control值是Y就输出,然后就结束程序,如此按照D>C>B>A 的优先级检查下去?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-12-25 08:47:41 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

仔细想了想,觉得优先级有点像if....else if....else if....这样,不知道对不对?please advise.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-12-25 09:40:26 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

If I can assume that a type denoted by a larger letter has higher priority, namely, Z > Y > X > ... > C > B > A, then the following might be it:

[code:2z869kv0]data raw;
   input number $ type $ control $;
datalines;
one A Y
one B Y
one C Y
one D N
two E Y
two F N
two D N
three Z N
three X N
three Y N
;
run;

proc sort data = raw
           out = sorted;
  by number
     decending type;
run;

data results(drop = output_already);
  set sorted;
  by number
     descending type;

  retain output_already;

  if first.number then output_already = 0;

  if output_already = 0 then do;
    if last.number or control = 'Y' then do;
      output_already = 1;
      output;
    end;
  end;
run; [/code:2z869kv0]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-12-25 10:19:12 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

如果我没理解错,排序后的last.var就是你要的结果
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-12-26 00:13:12 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

[quote="cloudpan2002":2ijcdt3a]If I can assume that a type denoted by a larger letter has higher priority, namely, Z > Y > X > ... > C > B > A, then the following might be it:

[code:2ijcdt3a]data raw;
   input number $ type $ control $;
datalines;
one A Y
one B Y
one C Y
one D N
two E Y
two F N
two D N
three Z N
three X N
three Y N
;
run;

proc sort data = raw
           out = sorted;
  by number
     decending type;
run;

data results(drop = output_already);
  set sorted;
  by number
     descending type;

  retain output_already;

  if first.number then output_already = 0;

  if output_already = 0 then do;
    if last.number or control = 'Y' then do;
      output_already = 1;
      output;
    end;
  end;
run; [/code:2ijcdt3a][/quote:2ijcdt3a]


我试验了一下,我想要的大概就是这样的效果,不过我不太看得懂这程序的原理,特别是output_already这里有什么用,能给我解析解析吗?谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-12-26 00:14:12 | 只看该作者

Re: 新手请教一个数据步问题,多多指教,谢谢

[quote="hopewell":3cnbl6ds]如果我没理解错,排序后的last.var就是你要的结果[/quote:3cnbl6ds]


谢谢hopewell的不倦解答,这里的人真好啊,呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-6 09:44 , Processed in 0.071596 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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