楼主: pinggu2688
2512 6

[问答] 如何用有条件的使用hash表 [推广有奖]

  • 2关注
  • 0粉丝

博士生

6%

还不是VIP/贵宾

-

威望
0
论坛币
40 个
通用积分
40.2335
学术水平
1 点
热心指数
3 点
信用等级
1 点
经验
3113 点
帖子
166
精华
0
在线时间
103 小时
注册时间
2009-11-12
最后登录
2024-8-28

楼主
pinggu2688 发表于 2012-3-22 11:12:26 |AI写论文
30论坛币
这样为什么 不可以? 如何修改?要求n< 3:
data Base;
     input id $ amount;
     datalines;
a  189
b  160
b  188
b  165
a  145
a  199
b 198
b  345
c  298
c 165
d 235
d 678
e 161
e 285
f 278
;
data Name;
    input id $ name $ n;
datalines;
a Jose 1
b Hose 2
c Jerry 3
d Sara 4
e Tom 5
;
data test6(drop=rc);
if 0 then set name;
if _n_ = 1 then do;
  dcl hash h(dataset: 'name (where=(n < 3))');
  h.definekey("id");
  h.definedata("id","name",'n');
  h.definedone();
end;
do until(eof);
set base end=eof;
name='';
rc=h.find();
output;
end;
run;
谢谢

关键词:HASH Has 如何用 Defined dataset 如何

本帖被以下文库推荐

沙发
情迷仲夏夜 发表于 2012-3-22 11:12:27
  1. data test6(drop=rc);
  2. if 0 then set name;
  3. if _n_ = 1 then do;
  4.    dcl hash h(dataset: 'name(where=(n < 3))');
  5.    h.definekey("id");
  6.    h.definedata("id","name",'n');
  7.    h.definedone();
  8. end;
  9. do until(eof);
  10.    set base end=eof;
  11.    name='';
  12.    rc=h.find();
  13.    output;
  14. end;
  15. *Obs    id    name    n    amount
  16.   1    a     Jose    1      189
  17.   2    a     Jose    1      145
  18.   3    a     Jose    1      199
  19.   4    b     Hose    2      160
  20.   5    b     Hose    2      188
  21.   6    b     Hose    2      165
  22.   7    b     Hose    2      198
  23.   8    b     Hose    2      345
  24.   9    c             2      298
  25. 10    c             2      165
  26. 11    d             2      235
  27. 12    d             2      678
  28. 13    e             2      161
  29. 14    e             2      285
  30. 15    f             2      278;
  31. proc print data=test6(obs=20);run;
复制代码

藤椅
maidenhan 发表于 2012-3-22 11:20:51
Is this what u want?

  1. data test;
  2. if 0 then set name;
  3. if _n_ = 1 then do;
  4.   dcl hash h(dataset:"name");
  5.   h.definekey("id");
  6.   h.definedata("id","name");
  7.   h.definedone();
  8. end;
  9. set base;
  10. if id <= 3 and h.find()=0 then do;
  11. end;else name = '';
  12. run;
复制代码

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
pinggu2688 + 1 + 1 + 1 观点有启发,我原来的问题没有表达清楚,请继.

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
pinggu2688 发表于 2012-3-22 23:07:27
maidenhan 发表于 2012-3-22 11:20
Is this what u want?
这样为什么 不可以? 如何修改?要求n< 3:
data Base;
     input id $ amount;
     datalines;
a  189
b  160
b  188
b  165
a  145
a  199
b 198
b  345
c  298
c 165
d 235
d 678
e 161
e 285
f 278
;
data Name;
    input id $ name $ n;
datalines;
a Jose 1
b Hose 2
c Jerry 3
d Sara 4
e Tom 5
;
data test6(drop=rc);
if 0 then set name;
if _n_ = 1 then do;
  dcl hash h(dataset: 'name (where=(n < 3))');
  h.definekey("id");
  h.definedata("id","name",'n');
  h.definedone();
end;
do until(eof);
set base end=eof;
name='';
rc=h.find();
output;
end;
run;

报纸
pinggu2688 发表于 2012-3-23 05:28:50
情迷仲夏夜 发表于 2012-3-23 03:27
ERROR: The value NAME(WHERE=(N < 3)) is not a valid SAS name.
ERROR: Hash data set load failed at line 758 column 4.
ERROR: DATA STEP Component Object failure.  Aborted during the EXECUTION phase.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: There were 1 observations read from the data set WORK.BASE.
我使用 SAS 9.1.

地板
情迷仲夏夜 发表于 2012-3-27 00:45:56
我最近新更新到SAS9。2,没有遇到什么问题!

7
情迷仲夏夜 发表于 2012-3-27 01:00:38
if you can't update to SAS v9.2, maybe you can run like the followings:
  1. data test;
  2. if 0 then set name;
  3. if _n_ = 1 then do;
  4.   dcl hash h(dataset:"name");
  5.   h.definekey("id");
  6.   h.definedata("id","name",'n');
  7.   h.definedone();
  8. end;
  9. set base;
  10.    if n < 3 and h.find()=0 then do;end;else name = '';
  11. proc sort data=test;by id;
  12. *Obs    id    name     n    amount
  13.   1    a     Jose     1      189
  14.   2    a     Jose     1      145
  15.   3    a     Jose     1      199
  16.   4    b     Hose     2      160
  17.   5    b     Hose     2      188
  18.   6    b     Hose     2      165
  19.   7    b     Hose     2      198
  20.   8    b     Hose     2      345
  21.   9    c     Jerry    3      298
  22. 10    c              3      165
  23. 11    d              4      235
  24. 12    d              4      678
  25. 13    e              5      161
  26. 14    e              5      285
  27. 15    f              5      278;
  28. proc print data=test;run;
复制代码
but the result is a little bit different with the result run on SAS v9.2.

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

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