计算从 ID 为 "break variable" 的特定日期开始的天数

Count the number of days from a specific date with ID as a "break variable"

我想使用变量 Id 作为“中断变量”计算从特定日期开始的天数,并将结果作为新列。我希望结果类似于数据框中的结果 RESULT.

我正在收集有关患者进展的数据 (Variable_x),我想在混合模型中使用“天数”变量作为时间变量。

变量如下:

Id <- c(1,1,1,1,2,2,2,5,5,5,5,5)
Date <- as.Date (c("2015-01-01", "2015-01-10", "2015-01-15","2015-01-25","2013-02-01", "2013-03-20", "2013-04-03","2014-05-06","2014-06-07","2014-06-08","2014-08-09","2014-10-10"))
Variable_x <- c("70","NA","55", "30", "70", "60", "NA", "80", "60", "70", "50","20")
Days <- c(0,9,14,24,0,47,61,0,32,33,95,157)

这是我的数据:

DATA <- data.frame(Id, Date, Variable_x)

这是我想要的数据:

RESULT <- data.frame(Id, Date, Days, Variable_x)

希望有人能给出答案或指出正确的方向。

不胜感激。

您可能正在寻找 diff 与 R 的众多分组函数之一相结合的方法。

这里有一个 "dplyr" 的例子:

library(dplyr)
DATA %>%
  group_by(Id) %>%
  mutate(Days = cumsum(c(0, diff(Date))))
# Source: local data frame [12 x 4]
# Groups: Id [3]
# 
#       Id       Date Variable_x  Days
#    (dbl)     (date)     (fctr) (dbl)
# 1      1 2015-01-01         70     0
# 2      1 2015-01-10         NA     9
# 3      1 2015-01-15         55    14
# 4      1 2015-01-25         30    24
# 5      2 2013-02-01         70     0
# 6      2 2013-03-20         60    47
# 7      2 2013-04-03         NA    61
# 8      5 2014-05-06         80     0
# 9      5 2014-06-07         60    32
# 10     5 2014-06-08         70    33
# 11     5 2014-08-09         50    95
# 12     5 2014-10-10         20   157

使用 data.table 的选项。我们将 'data.frame' 转换为 'data.table' (setDT(DATA)),按 'Id' 分组,我们得到 'Date' 和 lag 的差异=23=](shift 默认情况下有 type=lag),获取 cumsum 并分配 (:=) 输出以创建 'Days' 列。

library(data.table)#v1.9.6+
setDT(DATA)[, Days:=cumsum(as.numeric(Date-shift(Date, fill=Date[1L]))), Id]
DATA
#    Id       Date Variable_x Days
# 1:  1 2015-01-01         70    0
# 2:  1 2015-01-10         NA    9
# 3:  1 2015-01-15         55   14
# 4:  1 2015-01-25         30   24
# 5:  2 2013-02-01         70    0
# 6:  2 2013-03-20         60   47
# 7:  2 2013-04-03         NA   61
# 8:  5 2014-05-06         80    0
# 9:  5 2014-06-07         60   32
#10:  5 2014-06-08         70   33
#11:  5 2014-08-09         50   95
#12:  5 2014-10-10         20  157