作者chien533 (谣指部总司令)
站内Statistics
标题Re: [问题] SAS 资料整理问题?
时间Sun May 3 14:08:41 2015
※ 引述《andersonhaha (好山好水 多健康)》之铭言:
: 请问在 SAS 资料中,1997~2004 原始资料-> 预整理成的资料:
: id year data id year data
: 1 1997 0
: 1 1998 0 (第一次数值前,都设定0)
: 1 1999 1 1 1999 1
: 1 2000 1 (补上2000,2001=1)
: 1 2001 1
: 1 2002 2 1 2002 2 (2002=2 之後都设定2)
: 1 2003 1 1 2003 2
: 1 2004 1 1 2004 2
: 1. 2002=2 第一次出现最大值,之後都设定为 2
: 我用 proc expand: transformin=(movmax ) 这样可以吗?
: 2. 第一次数值之前都设定为0
: 第一次出现的数值可能 1 or 2, 之前都设为0. 是取 first.id year?
: 3. 第一个 1 and 第一个2 之间,如何补上年份,设定为1?
: 谢谢各位帮忙!
我猜你的资料应该有数个id,不会只有一个id=1,因为若只有一个id的话问题就很简单
但我假设你有三个id,并且最大值有可能跳到3的情况:
data temp1;
input id year data;
cards;
1 1999 1
1 2002 2
1 2003 1
1 2004 1
2 1998 1
2 2001 2
2 2002 1
2 2003 1
3 2000 1
3 2002 2
3 2003 3
run;
首先解决插补missing year和0的问题,若每个id的年份长度一样,那就先开一个模版:
data temp2;
do id = 1 to 3;
do year = 1997 to 2004;
data = 0;
output;
end;
end;
run;
然後把原始资料并入到这个模版里面,并且用lag function来位移数值:
data temp3;
/*先依照id和year合并资料*/
merge temp2 temp1;
by id year;
/*用data变数和lag function生出七个递延资料lag1~lag7,由於递延後下一个id*/
/*的第一个值会变成上一个id的最後一个值,所以每生出一个lag变数就要把第一*/
/*年(1997)的值变成missing*/
array a[7] lag1-lag7;
do i = 1 to 7;
if i = 1 then lag1 = lag(data);
else a[i] = lag(a[i-1]);
if year = 1997 then a[i] = .;
end;
/*然後把data, lag1~lag7这八个变数求最大值,结果就是你要的*/
data_new = max(of data--lag7);
/*lag1~lag7以及回圈index功成身退,删除!*/
drop lag1--i;
run;
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 72.191.32.43
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Statistics/M.1430633324.A.C02.html
※ 编辑: chien533 (72.191.32.43), 05/03/2015 14:09:24
1F:推 andersonhaha: 谢谢您的帮忙! 05/05 22:04