楼主: rockfido
3442 11

请教一个SAS DATA处理问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:1754份资源

博士生

32%

还不是VIP/贵宾

-

威望
0
论坛币
2715 个
通用积分
0.0341
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
4441 点
帖子
201
精华
0
在线时间
202 小时
注册时间
2008-8-29
最后登录
2024-11-1

楼主
rockfido 在职认证  发表于 2010-8-3 00:29:44 |AI写论文
100论坛币
有如下的DATA SET:

TypeNumber
A7
A7
A7
A7
A7
B12
B12
B12
B12
B12
B12
B12
B12
B12
B12
B12
B12
C10
C10


我需要生成如下的DATA:
TypeNumberRandom_Number
A701,03,12,13,24,98,10
A701,03,12,13,24,98,11
A701,03,12,13,24,98,12
A701,03,12,13,24,98,13
A701,03,12,13,24,98,14
B12
B12
B12
B12
B12
B12
B12
B12
B12
B12
B12
B12
C10
C10



其中RANDOM_NUMBER的是这样的要求,比如TYPE=A,NUMBER = 7,那我就需要从1到1000中随机取出7个数(不可以重复),并且最后把这7个数排列起来赋值给TYPE =A ,NUMBER = 7的所有OBS。

(对于,TYPE = B, NUMBER = 12, 则必须从1到1000中随机取出12个数,并最后把这7个数排列起来赋值给所有TYPE = B,NUMBER =12的OBS)

一点说明: TYPE = A的所有的OBS的NUMBER的值都是=7的(就是不存在,TYPE = A, NUMBER = 13这样的CASE)

另外,同样的TYPE中,随机数不可以重复。不同的TYPE中,随机数可以重复。。。。。

多谢!!

最佳答案

关键词:Data Number random type rand 请教 SAS Data

本帖被以下文库推荐

沙发
hopewell 发表于 2010-8-3 00:29:45
改过了
  1. /*仅用于9.2*/
  2. proc fcmp outlib=work.func.test;
  3.         function create_random(count,range) $ 100;
  4.                 attrib out_str length=$100;
  5.                 array random_arr[1] / nosymbols;
  6.                 call dynamic_array(random_arr,count);
  7.                 i=1; flag=0;
  8.                 do while(i le count);
  9.                         temp=ceil(range*ranuni(123456));
  10.                         do j=1 to i;
  11.                                 if temp=random_arr[j] then flag=1;
  12.                         end;
  13.                         if flag ne 1 then do;
  14.                                 random_arr[i]=temp;
  15.                                 out_str=catx(',',out_str,temp);
  16.                                 i+1;
  17.                         end;
  18.                         else flag=0;
  19.                 end;
  20.                 return(out_str);
  21.         endsub;
  22. run;
  23. data raw;
  24.         input Type $ Number;
  25. datalines;
  26. A 7
  27. A 7
  28. A 7
  29. A 7
  30. A 7
  31. B 12
  32. B 12
  33. B 12
  34. B 12
  35. B 12
  36. B 12
  37. B 12
  38. B 12
  39. B 12
  40. B 12
  41. B 12
  42. B 12
  43. C 10
  44. C 10
  45. ;
  46. options cmplib=work.func;
  47. data out;
  48.         retain type number random_number;
  49.         set raw;
  50.         by type;
  51.         if first.type then random_number=create_random(number,1000);
  52. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jingju11 + 1 + 1 + 1 含金量很高啊。

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

藤椅
shmilyshmily 发表于 2010-8-3 07:47:53
以下是我写的一个程序,应该可以达成楼主的目的。其中第一和第二个data step是用来生成楼主已有的data set的,楼主用的时候可以删了。接下来proc step排序,然后最后一个data step生成随机数并加到原有数据里面。

用的时候只需将最后两个step中的test2改成已有data set名,test3改成加入random number以后想要保存的data set的名称就行。

若有疑问的话,请发短信。
data test;
input type $ number;
cards;
A 7
B 12
C 10
;
run;


data test2(drop=i);
set test;
i=0;
do while(i lt 6);
i+1;
output;
end;
run;


proc sort data=test2;
by type number;
run;


data test3;
set test2;
by type number;
if first.number=1 then
b=round(1000*ranuni(0))||round(1000*ranuni(0))||round(1000*ranuni(0))||round(1000*ranuni(0))||round(1000*ranuni(0))||round(1000*ranuni(0))||round(1000*ranuni(0));;
retain b;
random_number=b;
run;

板凳
zhengjie198 发表于 2010-8-3 08:35:03
楼上的,我看了你写的,好像不行啊

报纸
hopewell 发表于 2010-8-3 08:38:33
在每个type组里随机数可以重复吗?在不同的type组里随机数可以重复吗?
  1. data raw;
  2.         input Type $ Number;
  3. datalines;
  4. A 7
  5. A 7
  6. A 7
  7. A 7
  8. A 7
  9. B 12
  10. B 12
  11. B 12
  12. B 12
  13. B 12
  14. B 12
  15. B 12
  16. B 12
  17. B 12
  18. B 12
  19. B 12
  20. B 12
  21. C 10
  22. C 10
  23. ;
  24. data temp(drop=i temp);
  25.         length random_number $100;
  26.         do _n_=1 by 1 until(last.type);
  27.                 set raw;
  28.                 by type;
  29.         end;
  30.         do i=1 to number;
  31.                 temp=round(1000*ranuni(0));
  32.                 Random_Number=catx(',',random_number,temp);
  33.         end;
  34.         do _n_=1 to _n_;
  35.                 set raw;
  36.                 output;
  37.         end;
  38. run;
复制代码
已有 1 人评分热心指数 收起 理由
crackman + 1 呵呵不错

总评分: 热心指数 + 1   查看全部评分

地板
shmilyshmily 发表于 2010-8-3 09:25:30
3# zhengjie198
我在我电脑上运行没问题啊 请问你觉得哪儿不对呢

7
bobguy 发表于 2010-8-3 09:46:15
Here is a simplified one.

data raw;
         input Type $ Number;
datalines;
A 7
A 7
A 7
B 12
B 12
C 10
C 10
;
data t2;
   set raw;
   by type;
   length ranNumber $20000;
   retain ranNumber;
   if first.type then do;
     do i =1 to Number;
        ranNumber=catx(',', ranNumber,ceil(1000*ranuni(1) ));
     end;
    end;
    output;
    if last.type then  ranNumber='';
    drop i;
    run;

    proc print; run;
**************************
   Obs    Type    Number    ranNumber

    1      A         7      185,971,400,260,922,970,543
    2      A         7      185,971,400,260,922,970,543
    3      A         7      185,971,400,260,922,970,543
    4      B        12      532,50,67,820,524,854,68,958,298,273,690,977
    5      B        12      532,50,67,820,524,854,68,958,298,273,690,977
    6      C        10      227,689,413,559,288,476,845,635,591,583
    7      C        10      227,689,413,559,288,476,845,635,591,583

8
rockfido 在职认证  发表于 2010-8-3 10:53:21
6# bobguy


THANKS A LOT...

忘记说了,同样的TYPE中,随机数不可以重复。。。

但是不同的TYPE中,随机数可以重复。。。。

9
rockfido 在职认证  发表于 2010-8-3 10:54:08
4# hopewell

同样的TYPE中,随机数不可以重复。

不同的TYPE中,随机数可以重复。。。

非常感谢!!

10
zl85 发表于 2010-8-3 12:38:05
shmilyshmily 发表于 2010-8-3 09:25
3# zhengjie198
我在我电脑上运行没问题啊 请问你觉得哪儿不对呢
test2的数据导入那里好像就不对,每个类型的行数是不一样的,A型只有五行
另外楼主要的随机数是1到1000,应该用ceil,用round会有0的可能

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

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