【问题标题】:Lag to previous day延迟到前一天
【发布时间】: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 几乎总是正确的。
  • 一个问题,只是为了明确一点:当您在同一日期有多个观察值时,分数变量在所有这些变量中总是相同的?

标签: r dplyr


【解决方案1】:

假设您落后于之前发生的日期(可能不是“昨天”),那么试试这个:

library(dplyr)
set.seed(2)
data.frame(
  id = 1:10,
  Date = Sys.Date() + sort(sample(c(0, 1, 3), size=10, replace=TRUE))
) %>%
  mutate(lagDate = lag(Date)) %>%
  group_by(Date) %>%
  mutate(lagDate = lagDate[1]) %>%
  ungroup()
# # A tibble: 10 x 3
#       id Date       lagDate   
#    <int> <date>     <date>    
#  1     1 2019-08-20 NA        
#  2     2 2019-08-20 NA        
#  3     3 2019-08-20 NA        
#  4     4 2019-08-21 2019-08-20
#  5     5 2019-08-21 2019-08-20
#  6     6 2019-08-21 2019-08-20
#  7     7 2019-08-23 2019-08-21
#  8     8 2019-08-23 2019-08-21
#  9     9 2019-08-23 2019-08-21
# 10    10 2019-08-23 2019-08-21

看多了,试试这个:

df <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
HomeTeam       Date           Score
Wolves         2019-08-21     96
Wolves         2019-08-21     97
Wolves         2019-08-20     3
Wolves         2019-08-20     1
Wolves         2019-08-19     4")
df$Date <- as.Date(df$Date)

df %>%
  mutate(lagDate = lag(Date)) %>%
  group_by(HomeTeam, Date) %>%
  summarize(lagDate = lagDate[1], Score = Score[1]) %>%
  ungroup() %>%
  select(HomeTeam, Date = lagDate, Score) %>%
  right_join(select(df, -Score), by = c("HomeTeam", "Date"))
# # A tibble: 5 x 3
#   HomeTeam Date       Score
#   <chr>    <date>     <int>
# 1 Wolves   2019-08-21     3
# 2 Wolves   2019-08-21     3
# 3 Wolves   2019-08-20     4
# 4 Wolves   2019-08-20     4
# 5 Wolves   2019-08-19    NA

【讨论】:

  • 我想他不想落后日期,而是分数变量。
  • 觉得这很到位。
  • ...虽然我认为您的上述解决方案不能正确容纳多个日期,因为它落后于 Score 而不是 Date
  • 做了一些测试,我认为它现在可以适应多个日期和多个团队。我想要发生的是滞后于前一天的得分,并且对于当天的所有比赛都相同,这就是为什么我滞后得分。
  • 假设您对2019-08-21 有一个观察,滞后分数应该是3 或1,为什么? “为什么”对于了解 lagScore[1] 在您的解决方案中是否合适很重要。
猜你喜欢
  • 1970-01-01
  • 2022-06-09
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多