2

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

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

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

4

1 回答 1

2

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)

于 2015-10-16T03:34:52.960 回答