我有以下資料集。

根據每一行的“start_date_event”,我已經總結了自相應事件開始日期起60 天范圍內(變數sum_days)發生的所有天數。
但是,有一個條件,例如,必須考慮僅大于 15 天的總和。 因此,對于超過 15 天的事件,我想將“0”分配給屬于相應時期的所有行。
預期輸出:

預期結果示例:第 2 行已變為 0,因為它包含在總和大于 15 days 的前一行的范圍內。記錄在第 2 行的事件開始于 2019-02-28,屬于 2019-01-01(事件開始)到 2019-03-06(60 天間隔結束,01-01-2019)的時間段 60) 的總和大于 15 的第一行。
有沒有人有什么建議?
可重現的例子:
library(data.table)
library(dplyr)
# Input data
data <- data.table(id = c("Group A", "Group A", "Group A", "Group A",
"Group B", "Group B"),
start_date_event = c("2019-01-01",
"2019-02-28",
"2019-03-13",
"2019-03-19",
"2020-04-02",
"2020-05-15"),
end_date_event = c("2019-01-05",
"2019-03-12",
"2019-03-18",
"2019-03-20",
"2020-05-06",
"2020-05-16"))
# Convert to date
data <- data %>%
dplyr::mutate(start_date_event = as.Date(start_date_event)) %>%
dplyr::mutate(end_date_event = as.Date(end_date_event)) %>%
dplyr::mutate(days_diff = as.integer(end_date_event - start_date_event)) %>%
dplyr::mutate(end_interval = end_date_event 60) %>%
data.table::setDT()
# Calculating cumulative sum within 60 days
data[.(c = id, tmin = start_date_event,
tmax = start_date_event 60),
on = .(id == c, start_date_event <= tmax,
start_date_event >= tmin),
sum_days := sum(days_diff), by = .EACHI]
uj5u.com熱心網友回復:
這應該有效:
library(sqldf)
library(dplyr)
library(data.table)
# Creating a new 'row column'
data$row_n <- 1:nrow(data)
# Identifying which lines overlap and then filtering data
data <- sqldf("select a.*,
coalesce(group_concat(b.rowid), '') as overlaps
from data a
left join data b on a.id = b.id and
not a.rowid = b.rowid and
((a.start_date_event between
b.start_date_event and b.end_interval) or
(b.start_date_event between a.start_date_event
and a.end_interval))
group by a.rowid
order by a.rowid") %>%
group_by(id) %>%
mutate(row_n = as.character(row_n),
previous_row = dplyr::lag(row_n, n = 1, default = NA),
previous_value = dplyr::lag(sum_days, n = 1, default = NA),
sum2 = case_when(mapply(grepl,previous_row, overlaps) == TRUE &
previous_value > 15 ~ as.integer(0),
TRUE ~ sum_days),
previous_value = dplyr::lag(sum2, n = 1, default = NA),
sum2 = case_when(mapply(grepl,previous_row, overlaps) == TRUE &
previous_value > 15 ~ as.integer(0),
TRUE ~ sum_days)) %>%
dplyr::select(-c(previous_value, previous_row, row_n))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362350.html
