计算R data.table中的时间Delta

时间:2014-09-27 22:07:13

标签: r date data.table

我有一个篮球运动员数据的数据表,其中包括每个游戏和多个玩家的游戏日期。我想创建一个列来计算自上一场比赛以来的天数。我在R中使用data.table包。

   PLAYERID GAME_DATE
1:     2989 2014-01-1
2:     2989 2014-01-3

我使用以下代码:

DT[, DAY_DIFF:=diff(GAME_DATE, lag=1), by=PLAYERID]

它返回:

   PLAYERID GAME_DATE DAY_DIFF
1:     2989 2014-01-1 2
2:     2989 2014-01-3 2

除了最后一行之外,它会追加下一个游戏的天数。在最后一行,它会追加自上一场比赛以来的天数,即我想要的值。我想把NA放在第一排,因为这是第一场比赛。

2 个答案:

答案 0 :(得分:3)

# Reproduce the data.table
DT <- fread("PLAYERID GAME_DATE\n2989 2014-01-1\n2989 2014-01-3")
DT[, GAME_DATE:=as.Date(GAME_DATE)]

# concatenate an NA to the front and use na.pad=FALSE with diff()
DT[, DAY_DIFF:=c(NA, diff(GAME_DATE, lag=1, na.pad=FALSE)), by=PLAYERID]
DT
#    PLAYERID  GAME_DATE DAY_DIFF
# 1:     2989 2014-01-01       NA
# 2:     2989 2014-01-03        2

答案 1 :(得分:0)

也许是一个更直观,更易读的解决方案:

library(data.table)
library(dplyr)
library(magrittr)

# Reproduce the data.table
DT <- fread("PLAYERID GAME_DATE\n2989 2014-01-1\n2989 2014-01-3\n2989 2014-07-10\n2900 2014-01-10")
DT[, GAME_DATE:=as.Date(GAME_DATE)]

# Use dplyr to lag
group_by( DT, PLAYERID ) %>% 
  mutate( DAY_DIFF = GAME_DATE - lag(GAME_DATE) )

#Source: local data table [4 x 3]
#Groups: PLAYERID
#
#  PLAYERID  GAME_DATE DAY_DIFF
#1     2900 2014-01-10      NA 
#2     2989 2014-01-01      NA 
#3     2989 2014-01-03       2 
#4     2989 2014-07-10     188