获取组内的(t-1)数据

UD1*_*989 5 r date apply

如果之前有人问过这个问题,我会道歉,但我找不到任何能够回答这个问题的问题.我有这样的数据:

Project        Date   price
      A   30/3/2013    2082
      B   19/3/2013    1567
      B   22/2/2013    1642
      C   12/4/2013    1575
      C    5/6/2013    1582
Run Code Online (Sandbox Code Playgroud)

我希望按组列出最后一个实例价格的列.例如,对于第2行,同一组的最后一个实例价格将为1642.最终数据看起来有点像这样:

Project        Date   price   lastPrice
      A   30/3/2013    2082           0
      B   19/3/2013    1567        1642
      B   22/2/2013    1642           0 
      C   12/4/2013    1575           0
      C    5/6/2013    1582        1575
Run Code Online (Sandbox Code Playgroud)

这该怎么做?我面临的主要问题是数据可能没有按日期排序,所以它不像我可以拿最后一个单元格.

Dav*_*urg 7

这是一个选项.NA如果0因为0可能是实际价格,我也建议使用s代替.

library(dplyr)
df %>% 
  arrange(as.Date(Date, format = "%d/%m/%Y")) %>%
  group_by(Project) %>%
  mutate(lastPrice = lag(price))

# Source: local data frame [5 x 4]
# Groups: Project
# 
#   Project      Date price lastPrice
# 1       B 22/2/2013  1642        NA
# 2       B 19/3/2013  1567      1642
# 3       A 30/3/2013  2082        NA
# 4       C 12/4/2013  1575        NA
# 5       C  5/6/2013  1582      1575
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用shift该开发人员版本data.table

library(data.table) ## v >= 1.9.5
setDT(df)[order(as.Date(Date, format = "%d/%m/%Y")), 
                lastPrice := shift(price), 
                by = Project]

#    Project      Date price lastPrice
# 1:       A 30/3/2013  2082        NA
# 2:       B 19/3/2013  1567      1642
# 3:       B 22/2/2013  1642        NA
# 4:       C 12/4/2013  1575        NA
# 5:       C  5/6/2013  1582      1575
Run Code Online (Sandbox Code Playgroud)

或者用基础R

df <- df[order(df$Project, as.Date(df$Date, format = "%d/%m/%Y")), ]
within(df, lastPrice <- ave(price, Project, FUN = function(x) c(NA, x[-length(x)])))
#   Project      Date price lastPrice
# 1       A 30/3/2013  2082        NA
# 3       B 22/2/2013  1642        NA
# 2       B 19/3/2013  1567      1642
# 4       C 12/4/2013  1575        NA
# 5       C  5/6/2013  1582      1575
Run Code Online (Sandbox Code Playgroud)

作为旁注,最好将日期列保留在一个Date类中,所以我建议df$Date <- as.Date(df$Date, format = "%d/%m/%Y")一劳永逸.