【问题标题】:R: date difference between (m+1)-th column of n-th row and m-th column of (n+1)-th rowR:第 n 行第 (m+1) 列与第 (n+1) 行第 m 列之间的日期差
【发布时间】:2015-10-16 03:16:17
【问题描述】:

我想附加一列,指示m+1-th col 之间的数据差异。 n-th 行和m-th 列。 n+1-th 行。

数据格式为df

set.seed(2)
user.list = c('A','B','C')
t = seq(as.Date("2015/1/1"), as.Date("2015/12/31"), 'days')
st = sort(sample(t, 10))
et = st+30
df = data.frame(
         user=sort(sample(user.list, 10, replace=T)),
         start=st,
         due=et
     )

预期的输出应该是

   user      start        due     td
1     A 2015-02-16 2015-03-18    -16
2     A 2015-03-02 2015-04-01    -23
3     A 2015-03-09 2015-04-08     70
4     A 2015-06-17 2015-07-17    197*
5     B 2015-07-15 2015-08-14    -17
6     B 2015-07-28 2015-08-27     17
7     B 2015-09-13 2015-10-13    109*
8     C 2015-10-26 2015-11-25     11
9     C 2015-12-06 2016-01-05    -29
10    C 2015-12-07 2016-01-06     24*

td表示时差,以天为单位。 例如,对于用户A,-16 来自 2015-03-02 和 2015-03-18 之间的差异; -23 是 2015-03-09 和 2015-04-01 之间的差值等。* 的数字是每个用户的最后一行,或者是从固定日期 2016-01-30 之间的差值得出的和 2015-07-17(对于用户 A)。

如果没有dlply(划分为用户列表)、forif(扫描每一行,看看它是否是用户的最后一个),如何通过有效的方式解决?

【问题讨论】:

    标签: r date dataframe date-difference


    【解决方案1】:

    dplyr:

    library(dplyr)
    df %>% group_by(user) %>% 
      mutate(start = c(start, as.Date("2016-01-30"))[-1]) %>%
      mutate(td = start - due)
    # Source: local data frame [10 x 4]
    # Groups: user [3]
    # 
    #      user      start        due       td
    #    (fctr)     (date)     (date)   (dfft)
    # 1       A 2015-03-02 2015-03-18 -16 days
    # 2       A 2015-03-09 2015-04-01 -23 days
    # 3       A 2015-06-17 2015-04-08  70 days
    # 4       A 2016-01-30 2015-07-17 197 days
    # 5       B 2015-07-28 2015-08-14 -17 days
    # 6       B 2015-09-13 2015-08-27  17 days
    # 7       B 2016-01-30 2015-10-13 109 days
    # 8       C 2015-12-06 2015-11-25  11 days
    # 9       C 2015-12-07 2016-01-05 -29 days
    # 10      C 2016-01-30 2016-01-06  24 days
    

    如果你想坚持base R,类似的东西:

    start <- ave(df$start, df$user, FUN=function(x) c(x, as.Date("2016-01-30"))[-1])
    df$td <- start - df$due
    

    如果你想做加星和去掉“天”单位之类的事情,你可以做相应的调整。 (即sub(" .*", "", df$td)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 2015-03-03
      • 1970-01-01
      • 2013-02-23
      • 2016-04-07
      • 2020-04-25
      • 1970-01-01
      • 2014-02-28
      相关资源
      最近更新 更多