【问题标题】:Identifying pairs of rows in dataframe where dates are within specified number of days识别数据框中日期在指定天数内的行对
【发布时间】:2016-03-18 21:38:25
【问题描述】:

我正在尝试创建一个类似于 CMS 发布 referral data 的数据集。简而言之,如果两位医生在 30 天内看到同一位患者,他们就会被联系在一起。

我有一个包含患者、医生和预约日期的数据集,例如:

df <- data.frame(
  doctor = c("Dr. Who", "Dr. Pepper", "Dr.Bob", "Dr. Strangelove"),
  patient = c("Mickey", "Mickey", "Mickey", "Mickey"),
  date = c("2015-01-15", "2015-01-21", "2015-04-01", "2015-02-18")
)

有了上面的数据集,我想写一些 R 代码来返回:

  • 博士。谁,Pepper 博士(因为他们会在 6 天内看到米奇)
  • 博士。 Pepper,Strangelove 博士(他们会在 28 天内看到米奇)

我的实际数据集包含更多医生、患者和日期。我没有太多的计算机科学背景,但这似乎是一项计算繁重的任务。

用简单的英语,我处理这个问题的方式是:

  1. 收集所有患者预约
  2. 对于每个约会日期,找出与所有其他约会日期的天数差异
  3. 返回任何两个相隔 +/- 30 天的医生对。

如果我能以任何方式改进我的问题,请告诉我。谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用mapply 来实现,它按元素应用多元函数。在这里,它遍历doctor 和date 列,将df 子集到与30 天内的日期相关联的与该预约不同的医生。多个匹配项与paste( ... , collapse = ', ') 组合在一起。

    df$linked_doc <- mapply(
      function(doc, date){paste(
        df[abs(date - df$date) < 30 & doc != df$doctor, 'doctor'], 
        collapse = ', ')}, 
      df$doctor, df$date)
    
    df
    #            doctor patient       date               linked_doc
    # 1         Dr. Who  Mickey 2015-01-15               Dr. Pepper
    # 2      Dr. Pepper  Mickey 2015-01-21 Dr. Who, Dr. Strangelove
    # 3          Dr.Bob  Mickey 2015-04-01                         
    # 4 Dr. Strangelove  Mickey 2015-02-18               Dr. Pepper
    

    当然,还有其他方法可以做到这一点。如果您有多个患者,您可以在应用该功能之前在patient 上split。

    【讨论】:

    • 谢谢!我想我需要回到旧代码,看看我还能在哪里使用 mapply。我很好奇 - 您是否使用另一行代码将 df$date 更改为适合您提供的解决方案的类?我不得不这样做:df$date&lt;-parse_date_time(df$date, "%y%m%d") df$linked_doc &lt;- mapply( function(doc, date){paste( df[abs(date - df$date) &lt; 2592000 &amp; doc != df$doctor, 'doctor'], collapse = ', ')}, df$doctor, df$date) 其中 2592000 是以秒为单位的 30 天。当我尝试使用 difftime(..) 时,我收到了 var 类型错误
    • 对不起,我应该把它包括在内!您需要一种日期格式,而不是日期时间格式。在这种情况下,您只需要df$date &lt;- as.Date(df$date)。由于您的日期已经是 ISO 格式,您甚至不需要将解析字符串传递给它!
    • 相关问题 - 您将如何首先拆分患者?是否将 mapply 嵌套在 sapply 中?
    • 有一些选项,但最简单的方法可能是将其添加为另一个变量和另一个条件:mapply( function(doc, date, patient){paste( df[abs(date - df$date) &lt; 30 &amp; doc != df$doctor &amp; patient == df$patient, 'doctor'], collapse = ', ')}, df$doctor, df$date, df$patient)
    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2021-06-12
    • 2019-03-12
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多