m***a 发帖数: 1175 | 1 我有一堆longitudinal的数据,每个id 出现不止一次, 这些id有个指标数据A, 和指
标数据B, 指标数据A每几个月,或一年或者两年采到 , 指标数据B每3 4年采到一次
,我现在要取和采指标数据B最近的一次的指标数据A,请问怎么取? 这俩数据采集时
的date可以相减得到time interval,但是id是longitudinal的,所以需要取每个id每
一次采样B时的最小的time interval的数据,跪求指点,给个方向。
没学过正真的data management,搞不定,不知道从那个方向查起。介绍本书也行啊 谢
谢啦。。。。 | m***a 发帖数: 1175 | 2 我只会SAS,不过你要跟我说需要别的语言解决,我就学习别的。哭。。。。。。。。
。 | g******2 发帖数: 234 | 3 Not familiar with SAS, but hope this helps:
1. organize your data to the following format:
ID, Date_B, B, A, time_difference
where time_difference is the absolute value of the Date_A - Date_B
2. obtain a min_difference table
ID, Date_B, min_time_difference
3. Join the two tables and only select the rows with time_difference == min_
time_difference. | m***a 发帖数: 1175 | 4 谢谢你的思路,很不错,我第二步上有点搞不定,正在尝试。我的难处就是id 是有
repeat B,我转换成横向数据,倒是可以弄 然后再merge以下就行,感觉应该有好办法
解决这问题。不过我笨到忘记absolute value。。。。
min_
【在 g******2 的大作中提到】 : Not familiar with SAS, but hope this helps: : 1. organize your data to the following format: : ID, Date_B, B, A, time_difference : where time_difference is the absolute value of the Date_A - Date_B : 2. obtain a min_difference table : ID, Date_B, min_time_difference : 3. Join the two tables and only select the rows with time_difference == min_ : time_difference.
| k*******a 发帖数: 772 | 5 用sql应该比较容易
你给个sample data | C******t 发帖数: 72 | 6 大概可以这样:
data Test;
input id ATime BTime;
dataline;
.....;
proc sql;
create table Intermediate as
select a.id, a.Btime, b.Atime, a.Btime-b.Atime as TimeDiff
from Test a
left outer join Test b
on a.id=b.id and a.Btime>=b.Atime
order by a.id, a.Btime, calculated TimeDiff;
quit;
data Final;
set Intermediate;
by id Btime TimeDiff;
if first.Btime then output;
run; | m***a 发帖数: 1175 | 7 大师 我来了,刚才上课去了。
两个data set
data A
id A_date A_value
1 9/20/2000 35
1 8/21/2001 34
1 7/22/2002 38
1 2/13/2003 34
1 12/23/2003 35
1 5/25/2005 37
2 3/31/2000 35
2 4/25/2001 38
2 5/23/2002 40
2 12/21/2002 44
2 8/28/2003 50
2 9/21/2004 56
data B
id B_date B_value
1 8/21/2000 100
1 12/21/2002 120
1 6/19/2005 125
2 2/21/2000 120
2 5/26/2002 130
2 12/25/2005 115
merge A B 后得到C
Data C 应该是这样的
id B_date B_value A_date(离B_date最近的时间) A_value(离B_date最近
的时间的值)
1 8/21/2000 100 9/20/2000 35
1 12/21/2002 120 2/13/2003 34
1 6/19/2005 125 5/25/2005 37
2 2/21/2000 120 3/31/2000 35
2 5/26/2002 130 5/23/2002 40
2 12/25/2005 115 9/21/2004 56
【在 k*******a 的大作中提到】 : 用sql应该比较容易 : 你给个sample data
| m***a 发帖数: 1175 | 8 大师 给个sample,能否调节下你的code,我觉得该是proc sql 只是不太用,不熟悉。
两个data set
data A
id A_date A_value
1 9/20/2000 35
1 8/21/2001 34
1 7/22/2002 38
1 2/13/2003 34
1 12/23/2003 35
1 5/25/2005 37
2 3/31/2000 35
2 4/25/2001 38
2 5/23/2002 40
2 12/21/2002 44
2 8/28/2003 50
2 9/21/2004 56
data B
id B_date B_value
1 8/21/2000 100
1 12/21/2002 120
1 6/19/2005 125
2 2/21/2000 120
2 5/26/2002 130
2 12/25/2005 115
merge A B 后得到C
Data C 应该是这样的
id B_date B_value A_date(离B_date最近的时间) A_value(离B_date最近
的时间的值)
1 8/21/2000 100 9/20/2000 35
1 12/21/2002 120 2/13/2003 34
1 6/19/2005 125 5/25/2005 37
2 2/21/2000 120 3/31/2000 35
2 5/26/2002 130 5/23/2002 40
2 12/25/2005 115 9/21/2004 56
【在 C******t 的大作中提到】 : 大概可以这样: : data Test; : input id ATime BTime; : dataline; : .....; : proc sql; : create table Intermediate as : select a.id, a.Btime, b.Atime, a.Btime-b.Atime as TimeDiff : from Test a : left outer join Test b
| k*******a 发帖数: 772 | 9 proc sql;
select B.*, A.A_Date, A.A_value, abs(B_Date-A_Date) as dif,
min(calculated dif) as mindif
from A, B
where A.id = B.id
group by B.id, B_Date
having calculated dif = calculated mindif
;
quit;
【在 m***a 的大作中提到】 : 大师 给个sample,能否调节下你的code,我觉得该是proc sql 只是不太用,不熟悉。 : 两个data set : data A : id A_date A_value : 1 9/20/2000 35 : 1 8/21/2001 34 : 1 7/22/2002 38 : 1 2/13/2003 34 : 1 12/23/2003 35 : 1 5/25/2005 37
| m***a 发帖数: 1175 | 10 啊 可以这样,我就知道有功能的,谢谢 Kirklanda 大师, 回头拿本proc sql好好练
练,谢谢啦,稍后收包子。
【在 k*******a 的大作中提到】 : proc sql; : select B.*, A.A_Date, A.A_value, abs(B_Date-A_Date) as dif, : min(calculated dif) as mindif : from A, B : where A.id = B.id : group by B.id, B_Date : having calculated dif = calculated mindif : ; : quit;
| w*******n 发帖数: 469 | 11 Good coding!
【在 k*******a 的大作中提到】 : proc sql; : select B.*, A.A_Date, A.A_value, abs(B_Date-A_Date) as dif, : min(calculated dif) as mindif : from A, B : where A.id = B.id : group by B.id, B_Date : having calculated dif = calculated mindif : ; : quit;
| m***a 发帖数: 1175 | 12 谢了 吃包子
【在 C******t 的大作中提到】 : 大概可以这样: : data Test; : input id ATime BTime; : dataline; : .....; : proc sql; : create table Intermediate as : select a.id, a.Btime, b.Atime, a.Btime-b.Atime as TimeDiff : from Test a : left outer join Test b
|
|