2017-04-18 26 views
1

我擁有股票和日期的數據框。我想添加一個「下一個日期」列。我應該怎麼做?如何在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 

回答

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

我們可以使用avebase 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] 
+0

你的第一個兩種解決方案並不完全工作。你的data.table解決方案工作正常。 – lebelinoz

+0

@lebelinoz對我來說,它使用你展示的例子正常工作。其實,我的意思是'c(x [-1],NA)',但忘了更新它 – akrun

+0

@lebelinoz是的,我編輯它。我的意思是說,最初,我複製/粘貼它,然後在我的系統上進行更改,但忘記更新代碼。 – akrun

相關問題