【问题标题】:Selecting rows with "closest" values in each subgroup using dplyr使用 dplyr 在每个子组中选择具有“最接近”值的行
【发布时间】: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 天的“相似”时间间隔。

标签: r group-by dplyr purrr


【解决方案1】:

这是我获得接近 0 的值的最佳方法,这可以解决问题的一半。关闭但未完成。

df %>%
  filter(group != "ref",
         abs(d_days) > 365) %>% 
  group_by(ID, group) %>%
  arrange(ID, date) %>%
  filter(abs(d_days - 0) == min(abs(d_days - 0)))

      ID       date d_days  group
   <int>     <fctr>  <int> <fctr>
1 377698 2006-11-15  -1006    pre
2 377698 2010-08-27    375   post
3 540688 2011-12-07   -770    pre
4 540688 2015-04-29    469   post

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2013-06-06
    相关资源
    最近更新 更多