楼主: harlon1976
2915 15

如何实现这个要求的程序编写 [推广有奖]

11
harlon1976 发表于 2010-7-25 06:40:21
9# soporaeternus
如果要把最终的变量X的取值表示出来,我使用下面的程序:
data d1;
set d;
rename getid=id;
proc sort data=d1 out=e1;
by id;
data hboutcome;
merge b e1;
by id;
run;
这样的程序应该是对的吧,请指示一下!

12
harlon1976 发表于 2010-7-25 06:41:52
谢谢各位高手的及时指教,没想到一个晚上本论坛上经常出现几个高手都来了,并给出了解决问题的办法,我要认真看看下,谢谢各位了。

13
soporaeternus 发表于 2010-7-25 08:44:41
11# harlon1976
没有开sas测,但是应该就是这样
把id替换成x,由于id和x一一对应,故可以用merge
10# jingju11
就是这个意思,把具体数字转化为自然数就是为了直接用对0-1随机数的拉伸来表示对于具体数字的取舍......
Let them be hard, but never unjust

14
jingju11 发表于 2010-7-25 09:21:05
  1. data informatD;
  2.   set YourData; retain fmtName '_Obs2X' type 'I';
  3.   start = _obs; label = x;
  4.   run;
  5. proc format cntlin = informatD; run;
  6. data random;
  7.   do _n_ = 1 to 20*10;
  8.     _obs = ceil(ranuni(111)*10); sample = ceil(_n_*0.1);
  9.     if mod(_n_, 10) = 1 then sum = 0;
  10.     sum = sum(sum, 10**_obs);
  11.   output;
  12.     end;
  13.   run;
  14. proc sql;
  15.   create table random1 as
  16.     select *, max(sum) as n_sum from random group by sample;
  17.     quit;
  18. %macro _1mcr; %local i;
  19.    data %do i = 1 %to 10; result&i %end;;
  20.        set random1;
  21.        X = input(_obs, _Obs2x.);
  22.        c_sum = put(n_sum, z12.);
  23.        %do i = 1 %to 10;
  24.           if substrn(c_sum, %eval(12-&i), 1) eq "0" then
  25.              if n_sum ne 10**%eval(&i+1) then output result&i;
  26.        %end;
  27.       drop sum n_sum c_sum;
  28.   run;
  29.      %mend _1mcr;
  30. %_1mcr
复制代码
YourData has to contain two variables of X and _obs (record order, similiar to _n_).

15
zhentao 发表于 2010-7-25 15:17:59
了不起。受教。

16
jingju11 发表于 2010-7-26 21:02:03
14# jingju11
非常有趣。从结果来看,在10个数中,随机放回性选出10, 某个数字被选不上的概率是35%。比以为的要大啊。

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

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