【问题标题】:How to sum row values if date is between 2 dates in specified row如果日期在指定行中的两个日期之间,如何对行值求和
【发布时间】:2016-04-13 11:31:15
【问题描述】:

我有如下数据集

    patient number    drugtype   date   date - 1 year  date + 1 year
    11                G5        1/1/15    1/1/14         1/1/16
    16                G5        5/4/13    5/4/12         5/4/14
    19                R6        2/1/12    2/1/11         2/1/13
    11                G5        7/4/14    7/4/13         7/4/15
    19                R6        4/6/11    4/6/10         4/6/12
    16                G5        3/2/12    3/2/11         3/2/13
    32                G5        2/4/14    2/4/13         2/4/15
    11                G5        1/1/10    1/1/9          1/1/11
    16                G5        1/4/15    1/3/14         1/4/16
    11                G5        31/12/15  31/12/14       31/12/16

我试图找出在服用药物后一年内为特定患者开药的次数,最终得到如下表格:

patient number    drugtype   date   date - 1 year  date + 1 year   number of prescriptions within year
    11                G5        1/1/15    1/1/14         1/1/16     3
    16                G5        5/4/13    5/4/12         5/4/14     1
    19                R6        2/1/12    2/1/11         2/1/13     2
    11                G5        7/4/14    7/4/13         7/4/15     2
    19                R6        4/6/11    4/6/10         4/6/12     2
    16                G5        3/2/12    3/2/11         3/2/13     1
    32                G5        2/4/14    2/4/13         2/4/15     1
    11                G5        1/1/10    1/1/9          1/1/11     1
    16                G5        1/4/15    1/3/14         1/4/16     1
    11                G5        31/12/15  31/12/14       31/12/16   2

所以从逻辑上讲,我需要循环遍历 numberofprescriptionswithinayear <- ifelse(patient number=x & drugtype=y & date > date-1year & date+1year, 1, 0)sum 所在的行。

是否有更简单的循环方式,因为我还需要添加其他变量,例如一年内 G5 的处方数,以及一年内 R6 的处方数。

我最初计算的处方数量有误。它的计算方式是在实际日期前后一年是否开出了多少其他处方(介于正一和负一之间) - 抱歉有任何不清楚的地方。

【问题讨论】:

  • 我不明白你的决赛桌。 11 号患者在 2015 年 1 月 1 日、2014 年 7 月 4 日、10 年 1 月 1 日和 15 年 12 月 31 日接受了 G5。您分别计算这些时间点的 3、2、1、1。请详细说明您的计算。
  • 请提供一个可重现的例子,这几乎不足以进行有意义的工作。
  • 澄清和更正的计算

标签: r


【解决方案1】:

我认为您的预期输出表中的值不正确。

您可以使用data.table 获得结果,方法是将您的数据与自身连接,然后进行简单的子集和计算

library(data.table)

## data (with formatted headings & date types)
dt <- structure(list(patient_number = c(11L, 16L, 19L, 11L, 19L, 16L, 
32L, 11L, 16L, 11L), drugtype = structure(c(1L, 1L, 2L, 1L, 2L, 
1L, 1L, 1L, 1L, 1L), .Label = c("G5", "R6"), class = "factor"), 
    date = structure(c(16436, 15800, 15341, 16167, 15129, 15373, 
    16162, 14610, 16526, 16800), class = "Date"), previous_year = structure(c(16071, 
    15435, 14976, 15802, 14764, 15008, 15797, 14245, 16130, 16435
    ), class = "Date"), next_year = structure(c(16801, 16165, 
    15707, 16532, 15495, 15739, 16527, 14975, 16892, 17166), class = "Date")), .Names = c("patient_number", 
"drugtype", "date", "previous_year", "next_year"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame"))

setDT(dt)

dt[ dt, on=c("patient_number", "drugtype"), allow.cartesian = T  ## join it all together
    ][ 
      previous_year <= i.date & i.date <= next_year              ## filter results
      ][
        , .(n_count = .N), by=.(patient_number, drugtype, date)  ## do the calculation
        ]

#     patient_number drugtype       date n_count
#  1:             11       G5 2015-01-01       3
#  2:             11       G5 2014-04-07       2
#  3:             11       G5 2015-12-31       2
#  4:             16       G5 2013-04-05       1
#  5:             19       R6 2012-01-02       2
#  6:             19       R6 2011-06-04       2
#  7:             16       G5 2012-02-03       1
#  8:             32       G5 2014-04-02       1
#  9:             11       G5 2010-01-01       1
# 10:             16       G5 2015-04-01       1

另一种方法,但结果相同

dt[ dt, 
    {
      idx = i.previous_year <= date &  date <= i.next_year
      .(date = date[idx],
        previous_year = previous_year[idx],
        next_year = next_year[idx])
    },
    on=c("patient_number", "drugtype"),
    by=.EACHI
    ][, .(n_count = .N), by=.(patient_number, drugtype, date)]

【讨论】:

  • 我在[.data.table(dt, dt, on = c("patient_number", "drugtype", "date"), : 未使用的参数 (on = c("patient_number ", "药物类型", "日期"))"
  • @user1745691 你用的是最新版本的data.table吗?
【解决方案2】:

我无法发表评论,因为我没有获得足够的声誉。 使用 lubridate --&gt; int_overlaps() 包,您可以确定日期时间是否在其他两个日期时间的间隔内。这可能会对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2015-07-05
    • 2018-09-15
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多