r - 查找客户的新近度
问题描述
我有一个数据框,其中包含客户 ID 和每月的旅行次数。我需要找到同样的新近度。即上次访问前经过的月数,例如,如果客户在第 2、3 和 7 个月访问。新近度是
M1 <- NA
M2 <- NA
M3 <- 1
M4 <- 1
M5 <- 2
M6 <- 3
M7 <- 4
M8 <- 1
我想为每个客户找到这个(关键是客户 ID),为期 18 个月。
我尝试使用循环,但不知道如何去做
check <- ifelse(DF$trip[i]>DF$trip)
something <- function(year, month){
for(i in 1:18000){
ifelse(DF$trip[i]>0,check,break)
}
}
for(i in 1:18000){
ifelse(DF$id[i+1]=DF$id[i], something, break)
}
解决方案
必须有更好的方法来做到这一点,但这是一种方法。我们为每个创建一row_number()
列,id
然后year
用小于当前行号和最后一个非零值的行号减去当前行号。
library(dplyr)
df1 %>%
group_by(id, year) %>%
mutate(row = row_number(),
recency = purrr::map_int(row,
~. - row[max(which(row < . & Trip != 0))])) %>%
select(-row)
# id year Month Trip recency
# <dbl> <dbl> <int> <dbl> <int>
# 1 1 1 1 0 NA
# 2 1 1 2 1 NA
# 3 1 1 3 2 1
# 4 1 1 4 0 1
# 5 1 1 5 0 2
# 6 1 1 6 0 3
# 7 1 1 7 1 4
# 8 1 1 8 0 1
# 9 1 1 9 0 2
#10 1 1 10 0 3
#11 10 1 1 1 NA
#12 10 1 2 2 1
#13 10 1 3 0 1
#14 10 1 4 0 2
这会引发一个可以忽略的警告,因为它是针对每个组中没有小于 1 的行号的第一行。
数据
df1 <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 10,
10), year = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), Month = c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L), Trip = c(0,
1, 2, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0)),class = "data.frame",row.names = c(NA,-14L))
推荐阅读
- selenium - 如何为每次页面加载时更改的 id 元素匹配 xpath?
- java - 在 List 上使用 set 方法
导致不支持的操作异常 - algorithm - 动态规划问题(输入不一致?)
- angular - 在FormArray中添加控件时可以设置FomControl的占位符吗?
- python - 解析大文件的多处理与多线程。并保持一个柜台没有。共处理的行数
- python-3.x - 解析时出现异常
- java - 使用 JDBC(Java) 的 Active Directory 密码连接
- vb.net - 如何使用标签获得正确的系列格式?
- javascript - 通过 Java sdk 嵌入 quicksight
- javascript - 带日期点开始的 Highchart 区域