r group by date difference 相对于第一个日期

r group by date difference with respect to first date

我有一个看起来像这样的数据集。

   Id      Date1        Cars
   1       2007-04-05   72
   2       2014-01-07   12
   2       2018-07-09   10
   2       2018-07-09   13 
   3       2005-11-19   22
   3       2005-11-23   13 
   4       2010-06-17   38
   4       2010-09-23   57 
   4       2010-09-23   41
   4       2010-10-04   17

我想做的是为每个 Id 获取与该 Id 的第一个日期(最早)日期的日期差异。对于每个 Id,(最早日期 - 第二个最早日期),(最早日期 - 第 3 个最早日期),(最早日期 - 第 4 个最早日期)......等等。

我最终会得到这样的数据集

   Id      Date1        Cars   Diff
   1       2007-04-05   72     NA
   2       2014-01-07   12     NA 
   2       2018-07-09   10     1644 = (2018-07-09 - 2014-01-07)
   2       2018-07-09   13     1644 = (2018-07-09 - 2014-01-07) 
   3       2005-11-19   22     NA
   3       2005-11-23   13     4    = (2005-11-23 - 2005-11-19)
   4       2010-06-17   38     NA
   4       2010-09-23   57     98   = (2010-09-23 - 2010-06-17)
   4       2010-09-23   41     98   = (2010-09-23 - 2010-06-17)
   4       2010-10-04   17     109  = (2010-10-04 - 2010-09-23)

我不清楚如何做到这一点。任何帮助将非常感激。谢谢

Date1 更改为日期 class。

df$Date1 = as.Date(df$Date1)

您可以用每个 Id 中的第一个值相减。这可以使用 dplyr 来完成。

library(dplyr)
df %>% group_by(Id) %>% mutate(Diff = as.integer(Date1 - first(Date1)))


#      Id Date1       Cars  Diff
#   <int> <date>     <int> <int>
# 1     1 2007-04-05    72     0
# 2     2 2014-01-07    12     0
# 3     2 2018-07-09    10  1644
# 4     2 2018-07-09    13  1644
# 5     3 2005-11-19    22     0
# 6     3 2005-11-23    13     4
# 7     4 2010-06-17    38     0
# 8     4 2010-09-23    57    98
# 9     4 2010-09-23    41    98
#10     4 2010-10-04    17   109

data.table

setDT(df)[, Diff := as.integer(Date1 - first(Date1)), Id]

或基数 R:

df$diff <- with(df, ave(as.integer(Date1), Id, FUN = function(x) x - x[1]))

如果您想要这样的输出,请将 0 替换为 NA