让我们假设我的代码访问某一行。如何手动访问滞后行。在示例中,我的代码选择了日期为"03.01.2010"的行。基于此,我如何访问例如以下行。
date <- c("01.01.2010","02.01.2010","03.01.2010","04.01.2010","07.01.2010")
ret <- c(1.1,1.2,1.3,1.4,1.5)
mydf <- data.frame(date, ret)
mydf
# date ret
# 1 01.01.2010 1.1
# 2 02.01.2010 1.2
# 3 03.01.2010 1.3
# 4 04.01.2010 1.4
# 5 07.01.2010 1.5
certaindate <- "03.01.2010"
mydf[mydf$date %in% certaindate, "ret"] # this is an important line in my code and I want to keep it there!
我觉得有点像
mydf[mydf$date %in% certaindate +1, "ret"]
会起作用,但不会。。
所以这是有效的:
mydf[mydf$date %in% certaindate, "ret"]
# [1] 1.3
mydf[which(mydf$date %in% certaindate)+1,]$ret
# [1] 1.4
函数which(...)
返回所有满足条件的元素的索引。然后你可以加1。
您的代码返回了一个逻辑向量(T/F)。加1会将所有逻辑值强制为0或1,给出一个1或2的数字向量,然后用于索引df
。
使用dplyr::lag()
:很容易做到这一点
library(dplyr)
df <- data.frame(
date = as.Date(c("2010-01-01", "2010-01-02", "2010-01-03", "2010-01-04",
"2010-01-07")),
ret = c(1.1, 1.2, 1.3, 1.4, 1.5)
)
df
#> date ret
#> 1 2010-01-01 1.1
#> 2 2010-01-02 1.2
#> 3 2010-01-03 1.3
#> 4 2010-01-04 1.4
#> 5 2010-01-07 1.5
lag(df$date)
#> [1] NA "2010-01-01" "2010-01-02" "2010-01-03" "2010-01-04"
mutate(df, last_date = lag(date))
#> date ret last_date
#> 1 2010-01-01 1.1 <NA>
#> 2 2010-01-02 1.2 2010-01-01
#> 3 2010-01-03 1.3 2010-01-02
#> 4 2010-01-04 1.4 2010-01-03
#> 5 2010-01-07 1.5 2010-01-04