管道dplyr & R中重叠日期期间的变化标志

vngu2lb8  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(129)

我有两个要添加标记的期间:

  • 2019年1月30日至6月1日
  • 2019年5月1日至7月1日

但是,当我使用case when时,它不会标记两个重叠的周期。我理解为什么,但是我怎么能做到这一点呢?我想简单地复制重叠周期中的行,并将一个标记为第一个周期,另一个标记为第二个周期。
下面是一些有争议的虚拟数据:

dummy <- data.frame(
  dates = seq(as.Date("2019-01-01"), as.Date("2021-01-01"), by = "days"),
  people = runif(732, min = 100, max = 15000)
)

dummy %>% 
  mutate(
    periods = case_when(
      dates >= as.Date("2019-01-30") & dates <= as.Date("2019-06-01") ~ "Period_1",
      dates >= as.Date("2019-05-01") & dates <= as.Date("2019-07-01") ~ "Period_2",
      T ~ "No_period"
    )
  )
zbwhf8kr

zbwhf8kr1#

为重叠时段创建另一个案例,然后使用separate_rows可能会有所帮助

library(tidyr)
library(dplyr)
dummy <- data.frame(
  dates = seq(as.Date("2019-04-29"), as.Date("2019-06-02"), by = "days"),
  people = runif(35, min = 100, max = 15000)
)

dummy %>% 
  mutate(
    periods = case_when(
      dates >= as.Date("2019-01-30") & dates < as.Date("2019-05-01") ~ "Period_1",
      dates > as.Date("2019-06-01") & dates <= as.Date("2019-07-01") ~ "Period_2",
      dates >= as.Date("2019-05-01") & dates <= as.Date("2019-06-01") ~ "Period_1,Period_2",
      T ~ "No_period"
    )
  )  %>%
  separate_rows(periods, sep = ",")

   dates      people periods 
   <date>      <dbl> <chr>   
 1 2019-04-29 11719. Period_1
 2 2019-04-30  8064. Period_1
 3 2019-05-01 11154. Period_1
 4 2019-05-01 11154. Period_2
 5 2019-05-02  9699. Period_1
 6 2019-05-02  9699. Period_2
 7 2019-05-03  2650. Period_1
 8 2019-05-03  2650. Period_2
 9 2019-05-04 11504. Period_1
10 2019-05-04 11504. Period_2
gxwragnw

gxwragnw2#

data.table方法

library(data.table)
# set dummy to data.table format
setDT(dummy)
# create data.table with periods
periods <- data.table(period = paste0("period_",1:2),
                      from  = as.Date(c("2019-01-30", "2019-05-01")),
                      to = as.Date(c("2019-06-01", "2019-07-01")))
# non-equi left join
final <- periods[dummy, on = .(from <= dates, to >= dates)]

相关问题