我有以下資料:
df <- data.frame(dt1 = c("2019-05-02", "2019-01-02", "2019-06-02"),
dt2 = c("2019-08-30", "2019-04-24", "2019-12-06") )
> df
dt1 dt2
1 2019-05-02 2019-08-30
2 2019-01-02 2019-04-24
3 2019-06-02 2019-12-06
這是我想要做的:
i)我想通過分箱創建因子,例如,對于第一個日期,日期分箱為 2019-07-31、2019-06-30、2019-05-31,因此基本上按 dt2 分箱。
ii) 我想計算每個 bin 中的日期總數。
預期的輸出是:
dt1 dt2 val_count
1 2019-05-02 2019-08-30 3
2 2019-01-02 2019-04-24 3
3 2019-06-02 2019-12-06 6
我發現這篇文章很相關。
注意:我不想在兩個日期的月份之間進行區分。
謝謝你的建議。
uj5u.com熱心網友回復:
這很混亂,但是如果您想計算dt1和之間的月份的最后一個日期有多少dt2,您可以嘗試
library(lubridate)
library(dplyr)
fd <- paste0(lubridate::year(min(df$dt1, df$dt2)), "-02-01") %>% as.Date()
ld <- paste0(lubridate::year(max(df$dt1, df$dt2)) 1, "-01-01") %>% as.Date()
x <- seq.Date(fd, ld, by = "month") - 1
df %>%
rowwise() %>%
mutate(val_count = length(x[dt1 < x & x < dt2]))
dt1 dt2 val_count
<chr> <chr> <int>
1 2019-05-02 2019-08-30 3
2 2019-01-02 2019-04-24 3
3 2019-06-02 2019-12-06 6
選擇<或<=取決于您的目的。
要獲得dt1和之間的總天數dt2,
df %>%
rowwise() %>%
mutate(val_count = length(x[dt1 < x & x < dt2])) %>%
mutate(dd = as.Date(dt2) - as.Date(dt1))
dt1 dt2 val_count dd
<chr> <chr> <int> <drtn>
1 2019-05-02 2019-08-30 3 120 days
2 2019-01-02 2019-04-24 3 112 days
3 2019-06-02 2019-12-06 6 187 days
添加
df %>%
rowwise() %>%
mutate(val_count = length(x[dt1 < x & x < dt2]),
val_count = ifelse(val_count == 0, 1, val_count)) %>%
mutate(dd = as.Date(dt2) - as.Date(dt1))
dt1 dt2 val_count dd
<chr> <chr> <dbl> <drtn>
1 2019-05-02 2019-08-30 3 120 days
2 2019-01-02 2019-04-24 3 112 days
3 2019-06-02 2019-12-06 6 187 days
4 2019-06-01 2019-06-02 1 1 days
uj5u.com熱心網友回復:
上面的解決方案確實有點亂,只需要一個簡單的oneliner就可以做到這一點
df <- data.frame(dt1 = c("2019-05-02", "2019-01-02", "2019-06-02", "2019-06-01"), dt2 = c("2019-08-30", "2019-04-24", "2019-12-06", "2019-06-02") )
df %>%
mutate(val_count = as.period(ymd(dt2) - ymd(dt1)) %/% months(1))
# dt1 dt2 val_count
# 1 2019-05-02 2019-08-30 3
# 2 2019-01-02 2019-04-24 3
# 3 2019-06-02 2019-12-06 6
# 4 2019-06-01 2019-06-02 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/366044.html
