首页 > 解决方案 > 查找客户的新近度

问题描述

我有一个数据框,其中包含客户 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)
}

标签: rdataframe

解决方案


必须有更好的方法来做到这一点,但这是一种方法。我们为每个创建一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))

推荐阅读