2014-09-27 45 views
2

我有一个包含每个游戏和多个玩家的游戏日期的篮球玩家数据的数据表。我想创建一个计算自上一场比赛以来的天数的列。我使用的是data.table包河R数据表中的计算时间增量

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

什么类是'GAME_DATE'?它看起来不像日期。如果是,那么这可能会起作用,否则,将'asDate()包装起来''DAY_DIFF:= c(NA,diff(GAME_DATE,lag = 1,na.pad = FALSE)),by = PLAYERID] 'GAME_DATE'周围' – GSee 2014-09-27 22:18:23

+0

只是双重检查'GAME_DATE'类。它是一个日期。我试过你的解决方案,它工作!谢谢。 – Bradley 2014-09-27 22:23:59

回答

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 
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 
+0

重新排序数据 – GSee 2014-09-27 23:59:02