【问题标题】:Sequentially update rows by group using data.table使用 data.table 按组顺序更新行
【发布时间】:2021-11-10 10:37:45
【问题描述】:

我对 R 比较陌生。我有一个假设的数据集,其中包含来自各种不同患者和药物类型的处方。我想做的是创建吸毒事件,即我想看看患者使用药物的时间。 sequentially update rows in data.table 帖子中提到的循环对我有用,但我不确定如何确保在遇到新的患者标识符或药物类型时循环重新开始。

这些是数据集“AllDrugs”中的一些行:

DrugType    ID  Duration StartPrescr    EndPrescr   n
1           1   90       5-3-2020       3-6-2020    1
1           2   30       7-1-2020       6-2-2020    1
1           2   30       14-1-2020      12-6-2020   2
1           2   30       21-01-2020     19-6-2020   3

注意:n 是一个数字,表示处方的 ID 和 DrugType

这是当前循环:

 for (i in 2:nrow(AllDrugs)) {
   if (AllDrugs[i,StartPrescr] >= AllDrugs[i-1,EndPrescr]) {
     AllDrugs[i, EndPrescr:= StartPrescr+ Duration]
   } else {
     AllDrugs[i, EndPrescr:= AllDrugs[i-1,EndPrescr] + Duration]
   }
 }

这是我得到的:

DrugType    ID  Duration    StartPrescr EndPrescr   n
1           1   90          5-3-2020    3-6-2020    1
1           2   30          7-1-2020    3-7-2020    1
1           2   30          14-1-2020   2-8-2020    2
1           2   30          21-01-2020  1-9-2020    3

这就是我想要的:

DrugType    ID  Duration    StartPrescr EndPrescr   n
1           1   90          5-3-2020    3-6-2020    1
1           2   30          7-1-2020    6-2-2020    1
1           2   30          14-1-2020   7-3-2020    2
1           2   30          21-01-2020  6-4-2020    3

如何根据 ID 和 DrugType 的处方持续时间来调整处方?注意:这是一种药物类型的示例,但 DrugType 也可以是 2 或 3 等。

【问题讨论】:

  • StartEpisode 背后的想法是什么?为什么StartPrescr 改变了您想要的输出?
  • StartEpisode 背后的想法是,在经过几次修改后,我想每次连续使用 DrugType 转到一行。我现在已经在数据集中删除了这个变量,以使我的问题更清楚。 StartPrescr 在输入和所需输出中应该相同(我已经更新了示例行)。

标签: r loops data.table


【解决方案1】:

这对你有用吗?

shift_end <- function(en,dur) {
  if(length(en)>1) for(i in 2:length(en)) en[i] = en[i-1] + dur[i]
  return(en)
}

df[order(ID, DrugType,StartPrescr), EndPrescr:=shift_end(EndPrescr,Duration), by=.(ID,DrugType)]

结果:

   DrugType ID Duration StartPrescr  EndPrescr n
1:        1  1       90  2020-03-05 2020-06-03 1
2:        1  2       30  2020-01-07 2020-02-06 1
3:        1  2       30  2020-01-14 2020-03-07 2
4:        1  2       30  2020-01-21 2020-04-06 3

数据来源:

df <- structure(list(
  DrugType = c(1, 1, 1, 1),
  ID = c(1, 2, 2, 2),
  Duration = c(90, 30, 30, 30),
  StartPrescr = structure(c(18326,18268, 18275, 18282), class = "Date"),
  EndPrescr = structure(c(18416, 18298, 18425, 18432), class = "Date"),
  n = c(1, 1, 2, 3)), row.names = c(NA,-4L),
  class = c("data.table", "data.frame")
)

【讨论】:

  • 我在整个数据集上运行了代码,它适用于每个 ID 和 DrugType!
猜你喜欢
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2013-03-07
  • 2023-03-31
  • 1970-01-01
  • 2012-05-21
相关资源
最近更新 更多