如何用R计算客户自加入年份起的平均购买次数?
计算客户自加入以来的平均购买次数
嘿,这个需求很清晰,咱们可以用两种方式来实现——一种是用tidyverse工具链(代码更直观易读),另一种是基础R写法,你可以按需选择。
首先先把你的完整数据框确认一下(补全id=4的缺失值):
id<-c(1,2,3,4) member_since<-c(2014,2016,2015,2014) X2014<-c(2,0,0,3) X2015<-c(3,0,4,2) X2016<-c(3,2,3,4) X2017<-c(2,3,6,0) df<-data.frame(id,member_since,X2014,X2015,X2016,X2017)
方法一:用tidyverse(推荐)
先加载tidyverse包(如果没装的话先运行install.packages("tidyverse")):
library(tidyverse) # 1. 把宽格式转成长格式,提取年份数值 df_long <- df %>% pivot_longer(cols = starts_with("X"), names_to = "year", values_to = "purchases") %>% mutate(year = as.numeric(str_remove(year, "X"))) # 去掉X,转成数字年份 # 2. 筛选每个客户加入年份及之后的记录,然后计算平均 avg_purchases <- df_long %>% filter(year >= member_since) %>% group_by(id) %>% summarise(avg_purchases = mean(purchases, na.rm = TRUE)) # 查看结果 avg_purchases
运行后你会得到每个客户的平均购买次数:
# A tibble: 4 × 2 id avg_purchases <dbl> <dbl> 1 1 2.5 2 2 2.5 3 3 4.33 4 4 2.25
步骤解释:
pivot_longer:把原来的X2014、X2015等列转成两列——year(年份)和purchases(购买次数),这样每条记录对应一个客户一年的购买数据,方便后续筛选。mutate(...):把year列的字符型(比如"X2014")转成数值型(2014),才能和member_since做比较。filter(year >= member_since):只保留客户加入年份及之后的购买记录,比如id=2是2016年加入的,就只保留2016和2017年的数据。group_by(id) %>% summarise(...):按客户id分组,计算每组的平均购买次数。
方法二:基础R写法
如果不想加载额外包,用基础R也能实现:
# 1. 提取年份列和对应的年份数值 year_cols <- grep("X20", colnames(df), value = TRUE) years <- as.numeric(sub("X", "", year_cols)) # 2. 循环计算每个客户的平均 avg_purchases_base <- data.frame(id = df$id, avg_purchases = NA) for(i in 1:nrow(df)){ # 获取该客户加入年份 join_year <- df$member_since[i] # 筛选加入年份及之后的购买次数 relevant_purchases <- df[i, year_cols[years >= join_year]] # 计算平均 avg_purchases_base$avg_purchases[i] <- mean(as.numeric(relevant_purchases), na.rm = TRUE) } # 查看结果 avg_purchases_base
结果和tidyverse方法一致:
id avg_purchases 1 1 2.500000 2 2 2.500000 3 3 4.333333 4 4 2.250000
两种方法都能得到你想要的结果,tidyverse的写法更简洁易维护,适合处理这类数据转换和统计的需求~
内容的提问来源于stack exchange,提问作者AliCivil
相关产品推荐
相关产品推荐

