【问题标题】:Adding actual date sequentially by iterating for each week通过每周迭代顺序添加实际日期
【发布时间】:2019-10-16 12:00:33
【问题描述】:

以下是示例数据。

structure(list(Starts = structure(c(18064, 18064, 18064, 18064, 
18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064, 
18064, 18085, 18085, 18085, 18085, 18085, 18085, 18085), class = "Date"), 
    Ends = structure(c(18070, 18070, 18070, 18070, 18070, 18070, 
    18070, 18070, 18070, 18070, 18070, 18070, 18070, 18070, 18091, 
    18091, 18091, 18091, 18091, 18091, 18091), class = "Date"), 
    Day = c("Mon on", "Tue on", "Wed on", "Thu on", "Fri on", 
    "Sat on", "Sun on", "Mon off", "Tue off", "Wed off", "Thu off", 
    "Fri off", "Sat off", "Sun off", "Mon on", "Tue on", "Wed on", 
    "Thu on", "Fri on", "Sat on", "Sun on")), row.names = c(NA, 
-21L), class = c("tbl_df", "tbl", "data.frame"))

我试图通过根据开始和结束日期(周从星期一开始,到星期日结束)迭代七次(一周)来按顺序添加每一行的实际日期。所需的输出是

structure(list(Starts = structure(c(18064, 18064, 18064, 18064, 
18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064, 
18064, 18085, 18085, 18085, 18085, 18085, 18085, 18085), class = "Date"), 
    Ends = structure(c(18070, 18070, 18070, 18070, 18070, 18070, 
    18070, 18070, 18070, 18070, 18070, 18070, 18070, 18070, 18091, 
    18091, 18091, 18091, 18091, 18091, 18091), class = "Date"), 
    Day = c("Mon on", "Tue on", "Wed on", "Thu on", "Fri on", 
    "Sat on", "Sun on", "Mon off", "Tue off", "Wed off", "Thu off", 
    "Fri off", "Sat off", "Sun off", "Mon on", "Tue on", "Wed on", 
    "Thu on", "Fri on", "Sat on", "Sun on"), `Actual Date` = structure(c(18064, 
    18065, 18066, 18067, 18068, 18069, 18070, 18064, 18065, 18066, 
    18067, 18068, 18069, 18070, 18085, 18086, 18087, 18088, 18089, 
    18090, 18091), class = "Date")), row.names = c(NA, -21L), class = c("tbl_df", 
"tbl", "data.frame"))

根据研究,我了解到我们可以使用seq 函数获取实际日期:

date = seq(as.Date("2019-06-17"), as.Date("2019-06-23"), by = "day")

但是,很难在数据框中将一天迭代 7 天。感谢您的支持。

【问题讨论】:

  • 你能保证行数总是能被7整除(每个数据)吗?
  • 是的,我可以看到从周一到周日的所有 7 天

标签: r datatable dplyr


【解决方案1】:

一种解决方法是:

mydata %>%
  mutate(`Actual Date` = Starts + case_when(grepl("Mon", Day) ~ 0,
                                            grepl("Tue", Day) ~ 1,
                                            grepl("Wed", Day) ~ 2,
                                            grepl("Thu", Day) ~ 3,
                                            grepl("Fri", Day) ~ 4,
                                            grepl("Sat", Day) ~ 5,
                                            grepl("Sun", Day) ~ 6)) 


# A tibble: 21 x 4
   Starts     Ends       Day     `Actual Date`
   <date>     <date>     <chr>   <date>       
 1 2019-06-17 2019-06-23 Mon on  2019-06-17   
 2 2019-06-17 2019-06-23 Tue on  2019-06-18   
 3 2019-06-17 2019-06-23 Wed on  2019-06-19   
 4 2019-06-17 2019-06-23 Thu on  2019-06-20   
 5 2019-06-17 2019-06-23 Fri on  2019-06-21   
 6 2019-06-17 2019-06-23 Sat on  2019-06-22   
 7 2019-06-17 2019-06-23 Sun on  2019-06-23   
 8 2019-06-17 2019-06-23 Mon off 2019-06-17   
 9 2019-06-17 2019-06-23 Tue off 2019-06-18   
10 2019-06-17 2019-06-23 Wed off 2019-06-19 

如果您确定您的数据顺序正确,您还可以按Starts 分组并执行以下操作:

mydata %>%
  group_by(Starts) %>%
  mutate(`Actual Date` = Starts + 1:n() - 1) 

【讨论】:

  • 虽然第二个选项可以解决我的问题,但第一个选项是一个很好的解决方法,可以作为任何人的参考。谢谢!
【解决方案2】:

这是一个基于 R 的想法,

ddf$new <- unlist(lapply(split(ddf, ddf$Starts), function(i) {
              i1 <- seq(i$Starts[1], i$Ends[1], by = 'day'); 
              as.character(rep(i1, nrow(i) / 7))
              }))

ddf
#       Starts       Ends     Day        new
#1  2019-06-17 2019-06-23  Mon on 2019-06-17
#2  2019-06-17 2019-06-23  Tue on 2019-06-18
#3  2019-06-17 2019-06-23  Wed on 2019-06-19
#4  2019-06-17 2019-06-23  Thu on 2019-06-20
#5  2019-06-17 2019-06-23  Fri on 2019-06-21
#6  2019-06-17 2019-06-23  Sat on 2019-06-22
#7  2019-06-17 2019-06-23  Sun on 2019-06-23
#8  2019-06-17 2019-06-23 Mon off 2019-06-17
#9  2019-06-17 2019-06-23 Tue off 2019-06-18
#10 2019-06-17 2019-06-23 Wed off 2019-06-19
#11 2019-06-17 2019-06-23 Thu off 2019-06-20
#12 2019-06-17 2019-06-23 Fri off 2019-06-21
#13 2019-06-17 2019-06-23 Sat off 2019-06-22
#14 2019-06-17 2019-06-23 Sun off 2019-06-23
#15 2019-07-08 2019-07-14  Mon on 2019-07-08
#16 2019-07-08 2019-07-14  Tue on 2019-07-09
#17 2019-07-08 2019-07-14  Wed on 2019-07-10
#18 2019-07-08 2019-07-14  Thu on 2019-07-11
#19 2019-07-08 2019-07-14  Fri on 2019-07-12
#20 2019-07-08 2019-07-14  Sat on 2019-07-13
#21 2019-07-08 2019-07-14  Sun on 2019-07-14

【讨论】:

    【解决方案3】:

    使用data.table包,可以解决如下:

    setDT(dt1)
    dt1[, `Actual Date` := .BY[[1]] + rep(0:6, .N/7), by = Starts]
    #        Starts       Ends     Day Actual Date
    #        <Date>     <Date>  <char>      <Date>    
    # 1: 2019-06-17 2019-06-23  Mon on  2019-06-17
    # 2: 2019-06-17 2019-06-23  Tue on  2019-06-18
    # 3: 2019-06-17 2019-06-23  Wed on  2019-06-19
    # 4: 2019-06-17 2019-06-23  Thu on  2019-06-20
    # 5: 2019-06-17 2019-06-23  Fri on  2019-06-21
    # 6: 2019-06-17 2019-06-23  Sat on  2019-06-22
    # 7: 2019-06-17 2019-06-23  Sun on  2019-06-23
    # 8: 2019-06-17 2019-06-23 Mon off  2019-06-17
    # 9: 2019-06-17 2019-06-23 Tue off  2019-06-18
    #10: 2019-06-17 2019-06-23 Wed off  2019-06-19
    #11: 2019-06-17 2019-06-23 Thu off  2019-06-20
    #12: 2019-06-17 2019-06-23 Fri off  2019-06-21
    #13: 2019-06-17 2019-06-23 Sat off  2019-06-22
    #14: 2019-06-17 2019-06-23 Sun off  2019-06-23
    #15: 2019-07-08 2019-07-14  Mon on  2019-07-08
    #16: 2019-07-08 2019-07-14  Tue on  2019-07-09
    #17: 2019-07-08 2019-07-14  Wed on  2019-07-10
    #18: 2019-07-08 2019-07-14  Thu on  2019-07-11
    #19: 2019-07-08 2019-07-14  Fri on  2019-07-12
    #20: 2019-07-08 2019-07-14  Sat on  2019-07-13
    #21: 2019-07-08 2019-07-14  Sun on  2019-07-14
    #        Starts       Ends     Day Actual Date
    

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多