全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3705 6
2012-10-23
悬赏 50 个论坛币 已解决
拜托老师帮我想一个问题,无论有空帮助否,非常感谢。

问题描述:我需要wocf(worst observation carried forward)的程序段。

首先我给大家描述下WOCF的意思是:一行观测,假如有20个变量,不妨假设从v1-v20分别为:1,2,3,...14,15,(缺失),(缺失),(缺失),(缺失),(缺失)。假如15是最好的,1是最差的。那么wocf的意思就是用最差的1来填补后面的5个观测。

实现问题:

前提假设:有个数据集out.all,内有观测v1-v20,20个变量,后5个缺失。

本来打算用数组进行,结果出了问题:(本问题已解决,max内不能用数组)

复制代码


然后企图在外面加个macro壳,结果继续碰了个钉子:
复制代码


拜托老师对两种方法分别予以指明,谢谢;本人方法控,不太以解决问题为目的。

最佳答案

pobel 查看完整内容

data out.wocf; set out.try; drop i; array va(20) v1-v20; do i=1 to 20; if i=1 then worst=va(i); else worst=max(va(i),worst); if missing(va(i)) then va(i)=worst; end; run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-10-23 00:21:52
data out.wocf;

set out.try;

drop i;
array va(20) v1-v20;

do i=1 to 20;
  if i=1 then worst=va(i);
  else worst=max(va(i),worst);

  if missing(va(i)) then va(i)=worst;
end;

run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-10-23 00:38:05
How about this~

data wocf;
set try;
drop i;
array va(20) v1-v20;
do i=1 to 20;
  if missing(va(i)) then va(i)=max(of v1-v20);
end;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-10-23 08:22:59
xuxin3000 发表于 2012-10-23 00:38
How about this~

data wocf;
感谢。这的确是直接把问题解决了,不过我想问的两个问题我还是搞不明白:1。max函数中是否不能用数组变量?还是我用错了?2。%do循环中的临时变量i的本次循环调用是&i.,那想调用上次循环的i,怎么用呢?

感谢解答。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-10-23 09:08:23
pobel 发表于 2012-10-23 08:36
data out.wocf;

set out.try;
谢谢pobel老师,这个做法可移植,采纳;

另外请问用宏套用的那个办法可行吗?就那一点过不去挺可惜的。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-10-23 11:41:04
There is no macro needed. Here is a simple way.

data t1;
  retain v1-v10 (2 3 -1 1 . 5 . 8 . 9);
  array v[*] v1-v10;
  *first get min value;
  min=min (of v[*]);
  do i=1 to dim (v);
     *patched value with min if it is missing;
     v[i]=coalesce(v[i],min);
  end;
run;

proc print;run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群