我有一个篮球运动员数据的数据表,其中包括每个游戏和多个玩家的游戏日期。我想创建一个列来计算自上一场比赛以来的天数。我在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放在第一排,因为这是第一场比赛。
答案 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