2014-09-27 30 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