【发布时间】:2019-12-26 03:35:02
【问题描述】:
我试图将数据滞后到 R 中的前一天。但是在数据集中,每天都有多个观察结果。我如何做到这一点?
我已经研究过使用 dplyr 来滞后变量并使用 if 语句来实现这一点,但是这需要大约 8 个嵌套的 if 语句来确保所有观察结果都滞后于前一天。
df <- df %>% dplyr::group_by(HomeTeam) %>%
dplyr::arrange(Date) %>%
dplyr::mutate(Score = ifelse(lag(Date) != Date, lag(Score),
ifelse(lag(Date, n = 2) != lag(Date),
lag(Score,n = 2), ifelse...)))
df <- data.frame(HomeTeam = c("Wolves", "Wolves", "Wolves"), Date = c("2019-08-20", "2019-08-20", "2019-08-19")
输入数据
HomeTeam Date Score
Wolves 2019-08-20 3
Wolves 2019-08-20 1
Wolves 2019-08-19 4
输出数据
HomeTeam Date Score
Wolves 2019-08-20 4
Wolves 2019-08-20 4
Wolves 2019-08-19 NA
解决方案
df <- data.frame(HomeTeam = c("Wolves", "Wolves",
"Wolves","Wolves","Wolves", "Man Utd", "Man Utd", "Man Utd"), Date =
c("2019-08-20", "2019-08-20", "2019-08-19", "2019-08-19", "2019-08-15",
"2019-06-01", "2019-06-01", "2019-04-01"), Score = c(3,1,2,2,4,5,6,7))
df %>% dplyr::mutate(Date = as.Date(Date)) %>%
dplyr::arrange(Date)%>%
dplyr::group_by(HomeTeam) %>%
dplyr::mutate(lagScore = lag(Score)) %>%
dplyr::arrange(Date) %>%
dplyr::group_by(Date,HomeTeam) %>%
dplyr::mutate(lagScore = lagScore[1]) %>%
dplyr::ungroup()
# A tibble: 8 x 4
# HomeTeam Date Score lagScore
# <fct> <date> <dbl> <dbl>
# Man Utd 2019-04-01 7 NA
# Man Utd 2019-06-01 5 7
# Man Utd 2019-06-01 6 7
# Wolves 2019-08-15 4 NA
# Wolves 2019-08-19 2 4
# Wolves 2019-08-19 2 4
# Wolves 2019-08-20 3 2
# Wolves 2019-08-20 1 2
【问题讨论】:
-
请提供示例输入数据和预期输出。
-
如果出现多次,您是否尝试过简单地减去 1 天?如果
"Date"类,那么Date - 1;如果"POSIXt"类,那么Date - 60*60*24几乎总是正确的。 -
一个问题,只是为了明确一点:当您在同一日期有多个观察值时,分数变量在所有这些变量中总是相同的?