如何在R数据框中为下一个日期添加列

时间:2017-04-18 03:23:55

标签: r

我有一个股票和日期的数据框。我想添加一个“下一个日期”列。我该怎么做?

数据如下:

df = data.frame(ticker = c("BHP", "BHP", "BHP", "BHP", "ANZ", "ANZ", "ANZ"), date = c("1999-05-31", "2000-06-30", "2001-06-29", "2002-06-28", "1999-09-30", "2000-09-29", "2001-09-28"))
df$date = as.POSIXct(df$date)

以人类可读的形式:

ticker   |   date
-----------------
BHP      | 1999-05-31
BHP      | 2000-06-30
BHP      | 2001-06-29
BHP      | 2002-06-28
ANZ      | 1999-09-30
ANZ      | 2000-09-29
ANZ      | 2001-09-28

我想要的是为下一个日期添加一列:

ticker   |   date      |  next_date
------------------------------------
BHP      | 1999-05-31  |  2000-06-30
BHP      | 2000-06-30  |  2001-06-29
BHP      | 2001-06-29  |  2002-06-28
BHP      | 2002-06-28  |  NA          # (or some default value)
ANZ      | 1999-09-30  |  2000-09-29
ANZ      | 2000-09-29  |  2001-09-28
ANZ      | 2001-09-28  |  NA

2 个答案:

答案 0 :(得分:4)

library(dplyr)
df %>% 
group_by(ticker) %>% 
mutate(next_date = lead(date))

答案 1 :(得分:1)

我们可以使用ave中的base R来执行此操作

df$next_date <- with(df, ave(as.Date(date), ticker, FUN = function(x) c(x[-1], NA)))
df$next_date
#[1] "2000-06-30" "2001-06-29" "2002-06-28" NA           "2000-09-29" "2001-09-28" NA     

或者我们可以使用data.table

library(data.table)
setDT(df)[, next_date := shift(date, type = "lead"), by = ticker]