s****l 发帖数: 129 | 1 现在我有一个data如下,
SUBJID VISID TIME VALUE
1 1 HH:MM:SS1 1
1 1 HH:MM:SS2 2
1 1 HH:MM:SS3 3
1 1 HH:MM:SS4 4
1 1 HH:MM:SS5 5
1 1 HH:MM:SS6 6
1 1 HH:MM:SS7 7
现在想把两次时间相隔不超过10分钟的归为一组,然后算均值。比如HH:MM:SS1与HH:MM
:SS2相隔小于10分钟,HH:MM:SS2与HH:MM:SS3相隔小于10分钟,HH:MM:SS3与HH:MM:SS4
相隔小于10分钟,那么把前4个归为一组,HH:MM:SS5-HH:MM:SS7类似,归为第二组,然
后求这两个组的均值。
在SAS里怎么实现?请大家不吝赐教!!!
谢谢! |
l****u 发帖数: 529 | |
s****l 发帖数: 129 | 3 能否具体一些?谢谢!!
【在 l****u 的大作中提到】 : array
|
a*****3 发帖数: 601 | 4 有意思。但要确认一下定义,比如,
2, 5,9,17 应该分成两组, 2, 5 组2: 9, 17,
还是分成一组,2,5,9,组2: 17 ?? |
k*****u 发帖数: 1688 | 5 用一个lag函数,然后每个加一个indicator
options formdlim='-';
data test;
input a;
cards;
1
2
3
4
16
28
;
run;
data test;
set test;
b=lag(a);
key=_n_;
run;
data test (drop=key b);
do key=2 by 1 until (last);
set test end=last;
if a-b<10 then id=1;
else id=2;
output;
end;
run;
proc print;
run; |
g****8 发帖数: 2828 | 6 用retain?
刚刚查到的,有个sas function dif() |
s****l 发帖数: 129 | 7 谢谢大家的回复,最后我用retain解决的这个问题, 不过从大家的回复中学到了不少
。下面是我的解决方法:
by subjid visid time ;
id + 1 ;
if first.visid then id = 1 ;
pre_time = lag(time) ;
if id = 1 then do ;
newtime = time ; pre_time = . ;
end ;
retain newtime ;
timediff = time - pre_time ;
if timediff > 10 then newtime = time;
run ;
Next calculate the mean within each "newtime" group. |
a*****3 发帖数: 601 | 8 interesting method. 但我有些reservation哦.
持谨慎的保留意见.
【在 k*****u 的大作中提到】 : 用一个lag函数,然后每个加一个indicator : options formdlim='-'; : data test; : input a; : cards; : 1 : 2 : 3 : 4 : 16
|
s****l 发帖数: 129 | 9 谢谢大家的回复,最后我用retain解决的这个问题, 不过从大家的回复中学到了不少
。下面是我的解决方法:
by subjid visid time ;
id + 1 ;
if first.visid then id = 1 ;
pre_time = lag(time) ;
if id = 1 then do ;
newtime = time ; pre_time = . ;
end ;
retain newtime ;
timediff = time - pre_time ;
if timediff > 10 then newtime = time;
run ;
Next calculate the mean within each "newtime" group. |
a*****3 发帖数: 601 | 10 还是没看太懂,..能不能给个sample_data run一下.
【在 s****l 的大作中提到】 : 谢谢大家的回复,最后我用retain解决的这个问题, 不过从大家的回复中学到了不少 : 。下面是我的解决方法: : by subjid visid time ; : id + 1 ; : if first.visid then id = 1 ; : pre_time = lag(time) ; : if id = 1 then do ; : newtime = time ; pre_time = . ; : end ; : retain newtime ;
|
g****8 发帖数: 2828 | 11 楼主,莫搞这么复杂,用现成的 就一个dif()函数解决了。咱们写这么多SAS会哭的。
【在 s****l 的大作中提到】 : 谢谢大家的回复,最后我用retain解决的这个问题, 不过从大家的回复中学到了不少 : 。下面是我的解决方法: : by subjid visid time ; : id + 1 ; : if first.visid then id = 1 ; : pre_time = lag(time) ; : if id = 1 then do ; : newtime = time ; pre_time = . ; : end ; : retain newtime ;
|
g****8 发帖数: 2828 | 12 data sample;
input TIME time8.;
cards;
11:30:01
11:40:01
11:51:01
11:52:01
12:20:01
13:32:01
13:35:01
14:50:02
14:52:02
15:12:01
;
run;
data sample;
set sample;
retain gr 1;
if dif(time) >600 then gr=_N_;
format time time8.;
run; |
l*******s 发帖数: 437 | |
s****l 发帖数: 129 | 14 Thanks all for your kind replying! |