w*****m 发帖数: 414 | 1 data是这样的:
year id sequence x
2000 id1 1 ..
2001 id1 2 ..
2002 id1 3 ..
2005 id1 1 ..
2006 id1 2 ..
2001 id2 1 ..
2002 id2 2 ..
2004 id2 1 ..
2007 id2 1 ..
2009 id2 1 ..
2000 id3 1 ..
2001 id3 2 ..
2002 id3 3 ..
2003 id3 4 ..
2004 id3 5 ..
2008 id3 1 ..
sequence 表示一个事件对于同一个对象在几年内连续发生。如果中间停了,则
sequence重新开始
计数。
问题:
对每一个对象的每一个sequence, 求x的和? 如果和可以做其他统计,比如mean median std
就更好了。
多谢大神指点。这个问题头疼好几天了。 |
k*******a 发帖数: 772 | 2 你可以新建一个变量,把他们group起来
data a;
input year id $ sequence x;
datalines;
2000 id1 1 1
2001 id1 2 2
2002 id1 3 2
2005 id1 1 2
2006 id1 2 3
2001 id2 1 6
2002 id2 2 7
2004 id2 1 1
2007 id2 1 2
2009 id2 1 8
2000 id3 1 9
2001 id3 2 1
2002 id3 3 2
2003 id3 4 3
2004 id3 5 4
2008 id3 1 6
;
data a;
set a;
by id;
if first.id then group=0;
if sequence=1 then group+1;
proc print data=a;run;
proc means data=a sum mean median std;
class id group;
var x;run; |
a********i 发帖数: 205 | 3 data sum;
input year id $ sequence x;
datalines;
2000 id1 1 35
2001 id1 2 60
2002 id1 3 80
2005 id1 1 76
2006 id1 2 95
2001 id2 1 108
2002 id2 2 87
2004 id2 1 76
2007 id2 1 84
2009 id2 1 98
2000 id3 1 123
2001 id3 2 198
2002 id3 3 82
2003 id3 4 90
2004 id3 5 23
2008 id3 1 90
;
run;
proc sort data=sum;
by id sequence;
run;
proc univariate data=sum noprint;
class id sequence;
var x;
output out=report sum=sum mean=mean median=median std=std;
run;
这样好像能做出来,不过我想用proc report做下,各位大神继续指教 |
h*****d 发帖数: 295 | 4 kiaklanda的生成group indicator的方法挺好的,但是LZ这种写法应该有问题。
基于kirklanda的proc report可以试试
proc report data=a nowd;
column id group (n mean median std),x;
define id/group;
define group/group;
define x/n mean std;
run;
当然你还可以加上些你需要的format。
【在 a********i 的大作中提到】 : data sum; : input year id $ sequence x; : datalines; : 2000 id1 1 35 : 2001 id1 2 60 : 2002 id1 3 80 : 2005 id1 1 76 : 2006 id1 2 95 : 2001 id2 1 108 : 2002 id2 2 87
|
w*****m 发帖数: 414 | 5 非常感谢 kirklanda,你的算法没有问题,完全解决了我的问题。
我以前是不知道怎么用 first.id then group=0 这一句命令。
另外讨论一个小问题,我需要把proc means的结果输出在另一个data set 里,所以我把
你的命令
改成
proc means data=a noprint;
by id group;
var x;
output
out=outdata
mean=x
median=x_m
std=x_std
sum=x_sum;
run;
结果没有问题,可奇怪的是,当我在你的原程序中直接加 noprint的时候,sas报语法
错;我把它
用output命令些出来,结果出错,我然后把class 改为 by,运行就没问题了。
没有大的变化,只是很奇怪SAS为什么这样?另给其他留个借鉴,希望有所帮助。
data a;
set a;
by id;
if first.id then group=0;
if sequence=1 then group+1;
proc print data=a;run;
proc means data=a sum mean median std;
class id group;
var x;run;
【在 k*******a 的大作中提到】 : 你可以新建一个变量,把他们group起来 : data a; : input year id $ sequence x; : datalines; : 2000 id1 1 1 : 2001 id1 2 2 : 2002 id1 3 2 : 2005 id1 1 2 : 2006 id1 2 3 : 2001 id2 1 6
|
w*****m 发帖数: 414 | 6 丸子的这个算法有个小问题。如果你看我的原始数据描述就会发现,每一个id中的
sequence有时候
是重复的。比如说,对于同一个id,事件在2000年发生一次,sequence=1, 2001没有发
生,跳
过,2002年发生一次,sequence=1, 2003年没发生,再跳过;2004年又发生一次,
sequence
还是=1,2005年没有发生,再次跳过。
对于这个id,sequence=1出现三次。丸子直接做
proc univariate data=sum noprint;
class id sequence;
就有问题了。
proc sort data=sum;
by id sequence;
run;
proc univariate data=sum noprint;
class id sequence;
var x;
output out=report sum=sum mean=mean median=median std=std;
run;
【在 a********i 的大作中提到】 : data sum; : input year id $ sequence x; : datalines; : 2000 id1 1 35 : 2001 id1 2 60 : 2002 id1 3 80 : 2005 id1 1 76 : 2006 id1 2 95 : 2001 id2 1 108 : 2002 id2 2 87
|
w*****m 发帖数: 414 | 7 多谢haywood参与讨论。
不过我真没看懂你的code, 也可能是因为我没用过proc report的原因。
你的code是不是基于kirklanda的group基础上的啊?
【在 h*****d 的大作中提到】 : kiaklanda的生成group indicator的方法挺好的,但是LZ这种写法应该有问题。 : 基于kirklanda的proc report可以试试 : proc report data=a nowd; : column id group (n mean median std),x; : define id/group; : define group/group; : define x/n mean std; : run; : 当然你还可以加上些你需要的format。
|
h*****d 发帖数: 295 | 8 是啊,用我写的proc report可以替代kirklanda的proc means那一段。我看到你说想用
proc
report。否则他的work的很好了。
【在 w*****m 的大作中提到】 : 多谢haywood参与讨论。 : 不过我真没看懂你的code, 也可能是因为我没用过proc report的原因。 : 你的code是不是基于kirklanda的group基础上的啊?
|
w*****m 发帖数: 414 | 9 我还真没用过proc report,下次有机会试一试。
不知道这个和proc means有什么特别不一样的地方???
【在 h*****d 的大作中提到】 : 是啊,用我写的proc report可以替代kirklanda的proc means那一段。我看到你说想用 : proc : report。否则他的work的很好了。
|
a********i 发帖数: 205 | 10
不是LZ说的是我说的= =~~
最近在搞proc report所以就顺便问问你们~~~
其实用proc means就很方便了
【在 h*****d 的大作中提到】 : 是啊,用我写的proc report可以替代kirklanda的proc means那一段。我看到你说想用 : proc : report。否则他的work的很好了。
|