楼主: jjtww
1528 3

[原创博文] 求SAS大牛,,,,,, [推广有奖]

  • 10关注
  • 5粉丝

已卖:673份资源

博士生

1%

还不是VIP/贵宾

-

威望
0
论坛币
13076 个
通用积分
2.3774
学术水平
2 点
热心指数
5 点
信用等级
2 点
经验
2841 点
帖子
189
精华
0
在线时间
194 小时
注册时间
2010-6-7
最后登录
2016-4-1

楼主
jjtww 发表于 2012-8-31 22:23:45 |AI写论文
10论坛币
  1. data _null_;

  2. array a [-100000 : 100000] _temporary_ ;

  3. ** allocate sample array with random numbers, about 10 percent duplicate ;

  4. do _q = lbound (a) to hbound (a) ;

  5. a [_q] = ceil (ranuni (1) * 2000000) ;

  6. end ;

  7. ** set sort parameters ;

  8. seq = ‘A’ ; * A = ascending, D = descending ;

  9. nodupkey = 0 ; * 0 = duplicates allowed, 1 = duplicates not allowed ;

  10. dcl hash _hh (hashexp: 0, ordered: seq) ;

  11. dcl hiter _hi (‘_hh’ ) ;

  12. _hh.definekey (‘_k’, ‘_n’ ) ; * _n – extra enumerating key ;

  13. _hh.definedata (‘_k’ ) ; * _k automatically assumes array data type ;

  14. _hh.definedone ( ) ;

  15. ** load composite (_k _n) key on the table ;

  16. ** if duplicates to be retained, set 0 <- _n ;

  17. do _j = lbound (a) to hbound (a) ;

  18. _n = _j * ^ nodupkey ;

  19. _k = a [_j] ;

  20. _hh.replace() ;

  21. end ;

  22. ** use iterator HI to reload array from HH table, now in order ;

  23. _n = lbound (a) – 1 ;

  24. do _rc = _hi.first() by 0 while ( _rc = 0 ) ;

  25. _n = _n + 1 ;

  26. a [_n] = _k ;

  27. _rc = _hi.next() ;

  28. end ;

  29. _q = _n ;

  30. ** fill array tail with missing values if duplicates are delete ;

  31. do _n = _q + 1 to hbound (a) ;

  32. a [_n] = . ;

  33. end ;

  34. drop _: ; * drop auxiliary variables ;

  35. ** check if array is now sorted ;

  36. sorted = 1 ;

  37. do _n = lbound (a) + 1 to _q while ( sorted ) ;

  38. if a [_n - 1] > a [_n] then sorted = 0 ;

  39. end ;

  40. put sorted = ;

  41. run ;
复制代码
上面代码是SAS HASH文献搜来的,没看明白,求高人解答!!!

最佳答案

情迷仲夏夜 查看完整内容

因为在SAS里,_null_和_temporary_都不会被显示出来,所以,我对原程序稍做了一点修改: 加上原程序内的注释,我想一般人大概应该可以看到原程序的用意和真相了: 1。先建立一个临时array叫_temporary_。 2。然后,给array赋予随机数值。 3。这个程序里,大概一般人不太熟悉的就是这第三部分的hash table的用法!如果有谁对此不很清楚,劳驾,请先阅读一下有关SAS hash table的内容和用法了!然后,再参看原程序中的英文注释 ...
关键词:duplicates parameters duplicate Parameter composite null

沙发
情迷仲夏夜 发表于 2012-8-31 22:23:46
因为在SAS里,_null_和_temporary_都不会被显示出来,所以,我对原程序稍做了一点修改:
  1. data chk;*_null_;
  2.    array a [-100000 : 100000];*_temporary_;

  3.    ** allocate sample array with random numbers, about 10 percent duplicate,给array赋予随机数值;
  4.    do _q = lbound (a) to hbound (a);
  5.       a [_q] = ceil (ranuni (1) * 2000000);
  6.    end;

  7.    ** set sort parameters;
  8.    seq = 'A'; * A = ascending(由小到大), D = descending(由大到小);
  9.    nodupkey = 0; * 0 = duplicates allowed(允许有重复), 1 = duplicates not allowed(不允许有重复);
  10.    dcl hash _hh (hashexp: 0, ordered: seq) ;*建立 hash table;
  11.    dcl hiter _hi ('_hh');
  12.    _hh.definekey ('_k', '_n'); * _n – extra enumerating key;
  13.    _hh.definedata ('_k'); * _k automatically assumes array data type;
  14.    _hh.definedone ( );

  15.    ** load composite (_k _n) key on the table;*将array a里的随机数值,引入到hash table里的_k, _n内;
  16.    ** if duplicates to be retained, set 0 <- _n;
  17.    do _j = lbound (a) to hbound (a);
  18.       _n = _j * ^ nodupkey;
  19.       _k = a [_j];
  20.       _hh.replace();
  21.    end;

  22.    ** use iterator HI to reload array from HH table, now in order;*排序!;
  23.    _n = lbound (a) - 1;
  24.    do _rc = _hi.first() by 0 while ( _rc = 0 );
  25.       _n = _n + 1;
  26.       a [_n] = _k;
  27.       _rc = _hi.next();
  28.    end ;
  29.    _q = _n;

  30.    ** fill array tail with missing values if duplicates are delete;*重复删减者给予missing values;
  31.    do _n = _q + 1 to hbound (a);
  32.       a [_n] = .;
  33.    end ;

  34.    *drop _:; * drop auxiliary variables: _j, _k, _n, _q, _rc等变量;

  35.    ** check if array is now sorted;*假定都已sort,并标记为1!;
  36.    sorted = 1;

  37.    do _n = lbound (a) + 1 to _q while ( sorted );
  38.       if a [_n - 1] > a [_n] then sorted = 0 ;*检测是否已经排序,并最后标记!如果有按由小到大未排序好的,就标为0;
  39.    end;
  40.    put sorted=;*打印显示出结果;
  41. proc print data=chk(obs=200);run;
复制代码
加上原程序内的注释,我想一般人大概应该可以看到原程序的用意和真相了:
1。先建立一个临时array叫_temporary_。
2。然后,给array赋予随机数值。
3。这个程序里,大概一般人不太熟悉的就是这第三部分的hash table的用法!如果有谁对此不很清楚,劳驾,请先阅读一下有关SAS hash table的内容和用法了!然后,再参看原程序中的英文注释!
4。之所以在此用hash table,我想或是为了快速方便下面的sort,因为hash table的方法里具有排序功能,简便易用?或是同时演示一下如何应用hash table吧?
5。当sorting结束,进行一下检测,然后,打印出检测结果来验证是否已sort,sort=1意思是已sort好,nodupkey=0意思是:允许有重复!
6。整个程序执行结束。

藤椅
jjtww 发表于 2012-9-1 02:17:47
哥们你太给力了,

板凳
jjtww 发表于 2012-9-1 02:19:09
实际上我是希望你帮我讲解讲解declare hiter的用法,

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

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