gpt4 book ai didi

r - 根据 R 中的其他因素处理日期

转载 作者:行者123 更新时间:2023-12-04 10:28:11 25 4
gpt4 key购买 nike

我无法找出解决此问题的最佳方法。我担心这可能是由于对分析的根本误解(稍后会详细介绍)。问题是这样的:在大约 25,000 笔交易中,我需要找出哪些客户在订阅到期后的两个月内调用。

id = unique customer ID

call = 1 signifies the observation is a call

lapse = 1 signifies the observation is a lapse

请注意,如果任何客户在同一日期有电话和故障,则该客户在该日期将有两个条目;客户可以在一个日期打多个电话(每个电话都有自己的观察和 df 中的自己的行);但任何客户每个日期只能失效一次。

无解的mini-df:
library(lubridate)
df <- data.frame(id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4),
date = dmy(c("01-01-2014", "07-02-2014", "05-03-2014", "14-02-2014", "15-04-2014", "17-04-2014", "11-05-2014", "19-08-2014", "07-10-2014", "21-12-2014", "04-06-2010", "06-03-2012", "12-07-2012", "13-07-2012", "14-01-2014", "05-05-2014", "19-08-2014", "19-08-2014", "13-02-2013", "11-11-2013", "04-03-2014", "10-12-2014", "02-03-2017", "03-03-2017")),
call = c(1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0),
lapse = c(0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1))

...和解向量:
df$call_2months_or_less_before_lapse <- c(1,    0,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0)

所以,当我这么说时,我会畏缩,但我可以在 Excel 中解决这个问题。然而,我拒绝放弃——我永远不会回去!

所以我想就解决方案的代码指出正确的方向,特别是如果这个方向在 tidyverse 的某个地方。但是,我担心我可能对整理数据有根本的误解。这是自从我开始学习 R 以来我无法用蛮力解决的第一个问题。

最佳答案

我只使用基本 R 代码编写了一个函数来查找每个失效日期和紧接其之前的最近通话日期之间的时间间隔(以天为单位)。然后,您可以使用 dplyr 按客户 ID 对数据框进行分组,并将该功能应用于每个客户。 dplyr 部分也可以使用 split() 使用基本 R 代码完成。和 lapply() .

# Function that finds time to most recent call before a lapse.
time_to_most_recent_call <- function(x) {
# Extract vector of dates when the subscription lapsed, and vector of dates when customer called.
lapse_dates <- x$date[x$lapse == 1]
call_dates <- x$date[x$call == 1]
# Get all pairwise time intervals in days between lapse and call.
time_intervals <- sapply(lapse_dates, function(z) z - call_dates)
# Find most recent call before each lapse (only look at positive time intervals)
shortest_intervals <- apply(time_intervals, 2, function(z) min(z[z >= 0]))
# Return result (also include flag if it's between 0 and 60)
return(data.frame(lapse_date = lapse_dates,
interval = shortest_intervals,
within2months = shortest_intervals >= 0 & shortest_intervals <= 60))
}

library(dplyr)

df %>%
group_by(id) %>%
do(time_to_most_recent_call(.))

这将为每个客户和每个失效日期返回从最近一次调用到该失效的间隔时间(以天为单位)。如果间隔小于 60 天(2 个月),它还会标记它。如果客户在失效之前从未打过电话,它会返回警告消息,因为在这种情况下最小间隔是无限的。

关于r - 根据 R 中的其他因素处理日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com