【发布时间】:2017-07-21 20:46:05
【问题描述】:
我刚刚学习 R,我试图找到一种从 data.frame 中选择行的方法
我想为每个ID 选择一行"pre" 和post,这在abs(d_days 中具有最小的差异),即具有相似的间隔pre-ref,ref-post。最小差异应为 1 年。
我不是在寻找最大或最小差异,而是寻找最接近/最近/最相似的差异 > 1 年。
我的测试 data.frame 看起来像:
"ID" "date" "d_days" "group"
"00377698" 2006-11-15 -1006 "pre"
"00377698" 2009-08-16 -1 "pre"
"00377698" 2009-08-17 0 "ref"
"00377698" 2009-08-24 7 "post"
"00377698" 2009-09-03 17 "post"
"00377698" 2009-10-09 53 "post"
"00377698" 2010-02-26 193 "post"
"00377698" 2010-08-27 375 "post"
"00377698" 2010-11-26 466 "post"
"00377698" 2011-08-24 737 "post"
"00540688" 2009-06-26 -1664 "pre"
"00540688" 2009-08-20 -1609 "pre"
"00540688" 2009-11-20 -1517 "pre"
"00540688" 2010-11-17 -1155 "pre"
"00540688" 2011-12-07 -770 "pre"
"00540688" 2014-01-09 -6 "pre"
"00540688" 2014-01-15 0 "ref"
"00540688" 2014-01-20 5 "post"
"00540688" 2014-03-05 49 "post"
"00540688" 2015-04-29 469 "post"
"00540688" 2015-09-30 623 "post"
"00540688" 2016-05-13 849 "post"
我的尝试:
我尝试了一些想法,例如data.frame %>% group_by(ID,group) %>% filter (group=="pre"| group=="post" & abs(d_days > 365)) %>% summarise(b = nth(abs(d_days[1]), which.max(abs(d_days[2]))))
我也试过roll=nearestR - merge dataframes on matching A, B and *closest* C?
我也试过这个find value closest to x by group in dplyr,但没有成功,因为我不是在寻找接近特定值的值,而是两个子组中“最接近”的值。
很遗憾,我找不到我要找的东西:
"ID" "date" "d_days" "group"
"00377698" 2006-11-15 -1006 "pre"
"00377698" 2009-08-17 0 "ref"
"00377698" 2011-08-24 737 "post"
"00540688" 2011-12-07 -770 "pre"
"00540688" 2014-01-15 0 "ref"
"00540688" 2015-09-30 894 "post"
非常感谢您的帮助!
【问题讨论】:
-
我对您的要求有点困惑,您是否只在尝试中寻找 >365 的“pre”和“post”组?我有类似
df %>% group_by(ID, group) %>% arrange(ID, date) %>% filter(abs(d_days) > 365) %>% mutate(range = as.Date(date)-lag(as.Date(date),1)) -
@ Geochem,非常感谢您的回答。我正在寻找 >365 且具有最接近时间间隔的“前”和“后”组(例如,从 ID 为 00540688 的所有“前”和“后”组中,最接近的间隔是 770 和 894。
-
为什么在你的最终解决方案示例中是“ref”?您是否正在寻找与“ref”最接近的值,因为在这种情况下它位于两个 ID 之间?
-
我在我的解决方案中添加了 ref 只是为了说明我的数据。它并不是真正需要的。我不是在寻找最接近“ref”的值,我只是在寻找 pre-ref 和 ref-post 之间 > 365 天的“相似”时间间隔。