在 R 中具有特定列类别的数据框中查找上一个日期

数据挖掘 r 数据框 数据表
2022-03-10 02:33:09

我有以下数据框:

      Date.POSIXct       Date      WeekDay DayCategory Hour Holidays   value
1 2018-05-01 00:00:00 2018-05-01      MA    MA-MI-JU    0        0      30
2 2018-05-01 01:00:00 2018-05-01      MA    MA-MI-JU    1        0      80
3 2018-05-01 02:00:00 2018-05-01      MA    MA-MI-JU    2        0      42
4 2018-05-01 03:00:00 2018-05-01      MA    MA-MI-JU    3        0      90
5 2018-05-01 04:00:00 2018-05-01      MA    MA-MI-JU    4        0      95
6 2018-05-01 05:00:00 2018-05-01      MA    MA-MI-JU    5        0       5

DayCategory 按以下方式对一周中的几天进行分组:Mondays 转到LUDayCategory。周二、周三和周四转到MA-MI-JUDayCategory。周五转至VI,周六转至SA,周日转至DO类别。

我想在前一天 ( )中找到value相同的相同,而仍然在同一组中(例如,如果一个实例有0,但前一天相同有 1,我们应该查找前一个,等等。 )hourDateDayCategoryHolidaysholidayDayCategory

作为中间步骤并了解该过程,我想添加一个PreviousDaySameDayCategoryDate前一天具有相同DayCategory对应行的列。有时它会date减去 7 天(“LU”、“VI”、“SA”、“DO”),但其他日子只会是 1 天。

可重现的数据:

library(lubridate)
Date.POSIXct <- seq(as.POSIXct("2018-05-01"), as.POSIXct("2018-05-31"), "hour")
mydf <- as.data.frame(Date.POSIXct)
mydf$Date <- as.Date(substr(as.character(mydf$Date.POSIXct),1,10))
mydf$WeekDay <- substr(toupper((weekdays(mydf$Date))),1,2)
mydf$DayCategory <-as.factor(ifelse(mydf$WeekDay == "MA" | mydf$WeekDay == "MI" | mydf$WeekDay == "JU", 
                                    "MA-MI-JU", mydf$WeekDay))
mydf$Hour <- hour(mydf$Date.POSIXct)
mydf$Holidays <- c(rep(0, 24*7),rep(1, 24*7), rep(0, 24*16+1))
set.seed(123)
mydf$myvalue <- sample.int(101,size=nrow(mydf),replace=TRUE)

我已经手动开始了第一天,并创建了一个解决方案应该是什么样子的向量:

  a <- rep(NA, 24)
  b <- mydf$value[1:24]
  c <- mydf$value[25:48]
  d <- rep(NA, 24)
  e <- rep(NA,24)
  f <- rep(NA,24)
  g <- rep(NA,24)
  h <- rep(NA,24)
  i <- mydf$value[169:192]
  solution <- c(a,b,c,d,e,f,g,h,i)
  solution

我将不胜感激思考过程中的任何提示,以解决我相对频繁面临的此类问题。

我还在 Stack Over Flow 中发布了这个问题,我想这种问题更适合这个社区而不是 StackOverflow,这是正确的吗?我想删除不太适合社区的那个。

1个回答

如果我理解正确,您想检索同一天类别、同一假期课程、同一小时的日期。

如果是这种情况,也许您可​​以尝试:

1) 将同一小时、同一天类别和同一假期组内的行分段到同一集群(或过滤器等)中

2)对于每个集群,从最低等开始对日期(组中的第一天为 0,第二天 = 1,...第 n 天 = n - 1 等)进行排名。

3) 对于每个 Rank r,通过在同一集群中查找 r - 1 行的日期来分配 PreviousDaySameDayCategory

使用 dplyr 实现起来相当简单。如果以下内容对您有意义,请告诉我。

(由于某些原因,我无法运行您的解决方案)

图书馆(dplyr)
排名Df <- mydf %>%
  group_by(DayCategory, Hour, Holidays) %>%
  安排(DayCategory, Hour, Holidays, Date) %>%
  mutate(rowRank = order(Date), previousRowRank = order(Date) - 1) %>%
  left_join(., ., by = c("previousRowRank" = "rowRank", "DayCategory", "Hour", "Holidays")) %>%
  选择(
    日期.POSIXct = 日期.POSIXct.x,
    日期 = 日期.x,
    工作日 = WeekDay.x,
    日类别,
    小时,
    假期,
    我的价值=我的价值.x,
    PreviousDaySameDayCategory = Date.y,
    PreviousValueSameDayCategory = myvalue.y
  )
print.data.frame(rankedDf, nrow = 500)

注意:我在排列中也包括了DayCategory等,以便更容易理解它是如何工作的;该代码仅使用 Date 作为参数就可以正常工作。