R语言 使用从开始日期起13周内的事件计数创建变量/列

xpcnnkqh  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(109)

数据框架由每个登录事件的case_number(chr)、onboarding_date Y-m-d和raised_at [Y-m-d h:m:s](POSIX ct)组成。我正在寻找一种方法来计算在入职日期和入职后13周(或91天)之间发生的登录事件(raised_at)的数量。

log_df <- data.frame(
  case_number = c("000920", "000920", "000920", "000920", "000921", "000921"),
  onboarding_date = as.Date(c("2020-10-27", "2020-10-27", "2020-10-27", "2020-10-27", "2020-11-08", "2020-11-08")),
  raised_at = as.POSIXct(c("2020-10-27 02:52:31", "2020-10-27 05:40:51", "2020-10-27 05:46:25", "2020-10-28 09:05:21", "2020-11-08 23:39:15", "2020-11-11 00:19:16"))
)

字符串
我相信我需要创建一个interval对象,但我在这方面很新:

int <- interval(ymd("2001-01-01"), ymd("2002-01-01"))
interval = int_shift(int, duration(days = 91))


我不知道下一步该怎么办。
我现在是否可以创建一个表,使用onboarding_date+interval仅包含raised_at事件,以排除91天关注窗口之外的案例?然后用group_by(case_number)计数raised_at?
我在下一个部分被卡住了,困惑了自己:

log_df %>%
  group_by(case_number) %>%
  mutate(interval = onboarding_date - min(onboarding_date) < 91,
         count_events = sum(raised_at) >= 1,
         event_within_interval = if_else(interval & count_events, 
                                         1, 0)) %>%
  ungroup()


它不工作,我似乎不能使它工作。
mutate()中的错误:
!计算count_events = sum(raised_at) >= 1时出错。i组1中发生错误:case_number =“ACU0000920”。Summary.POSIXct()中的错误导致:!'sum'未为“POSIX”对象定义
我知道它不能计算POSIXct日期,但我不知道如何修复我的代码中的这个错误,使其工作。我肯定错过了一些显而易见的东西。如果你能帮助我看到我错过了什么,我真的很感谢你对刚刚起步的人的明智建议。

cmssoen2

cmssoen21#

您可以像这样以天为单位测量间隔。在这个阶段不需要分组,从数据的外观来看,因为onboarding_date看起来是常数case_number。不分组比较快。

log_df  <- log_df |>
    mutate(
        interval_days = as.Date(raised_at) - onboarding_date,
        in_window = interval_days > 91
    )

log_df
#   case_number onboarding_date           raised_at interval_days in_window
# 1   1  000920      2020-10-27 2020-10-27 02:52:31        0 days     FALSE
# 2   2  000920      2020-10-27 2020-10-27 05:40:51        0 days     FALSE
# 3   3  000920      2020-10-27 2020-10-27 05:46:25        0 days     FALSE
# 4   4  000920      2020-10-27 2020-10-28 09:05:21        1 days     FALSE
# 5   5  000921      2020-11-08 2020-11-08 23:39:15        0 days     FALSE
# 6   6  000921      2020-11-08 2020-11-11 00:19:16        3 days     FALSE

字符串
然后简单地计算每组有多少人:

log_df |>
    filter(in_window) |>
    group_by(case_number) |>
    summarise(n = n())


您的样本数据没有任何间隔超过91天的情况,但在您的真实的数据中,这应该提供您所要求的。我使用了dplyr语法,就像您在这里使用它一样。但是,要在base R中执行类似的操作,您可以执行以下操作:

# This produces the same data.frame as above
log_df <- within(log_df, {
    interval_days <- as.Date(raised_at) - as.Date(onboarding_date)
    in_window <- interval_days > 91
})

# This produces a named array of counts outside the window for each `case_number` 
with(log_df, tapply(in_window, case_number, sum))

# Alternatively if you want a data.frame
aggregate(in_window ~ case_number, data = log_df, sum)

k3fezbri

k3fezbri2#

这应该可以!

log_df %>%
  mutate(events = map_dbl(onboarding_date, ~ sum(between(log_df$raised_at, .x, .x + days(91)))))

字符串

相关问题