[英]Calculating average number of customer purchases since the year joined in R
我在R中有以下數據框,其中顯示了4個客戶在四年期間每年的購買數量。 member_since
變量顯示客戶加入公司的年份。
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)
id member_since X2014 X2015 X2016 X2017
1 2014 2 3 3 2
2 2016 0 0 2 3
3 2015 0 4 3 6
4 2014 3 2 4 0
現在我正在嘗試創建一個新的變量mean_purchase
來計算每個客戶每年的平均購買數量,從他/她加入的那一年起。 這意味着例如對於customer 2
,購買總數應除以2,但對於customer 4
,購買總和應除以4。
id member_since X2014 X2015 X2016 X2017 mean_purchase
1 2014 2 3 3 2 2.5
2 2016 0 0 2 3 2.5
3 2015 0 4 3 6 4.33
4 2014 3 2 4 0 2.25
非常感謝您的幫助。
我們可以使用apply
df$mean_purchase <- apply(df[3:6], 1, function(x) round(sum(x)/sum(cumsum(x > 0) > 0), 2))
df$mean_purchase
#[1] 2.50 2.50 4.33 2.25
或者使用rowCumsums
的matrixStats
library(matrixStats)
rowSums(df[3:6])/rowSums(rowCumsums(+(df[3:6] > 0)) > 0)
apply
的另一種解決方案
df$mean_purchase <- apply(df[3:6], 1, function(x) mean(x[min(which(x != 0)):length(x)]))
df$mean_purchase
# [1] 2.500000 2.500000 4.333333 2.250000
根據akrun的回答,如果您想要包含客戶加入該計划但在第一年沒有購買任何東西的情況,請使用mapply
進行mapply
。
mapply(function(x,y) round(mean(unlist(df[x,(3+y):6])),2),
1:nrow(df), df$member_since - 2014)
# [1] 2.50 2.50 4.33 2.25
我們用NA
替換不相關的零(我建議你保持這種方式),然后我們使用rowMeans
。
df[-(1:2)][t(apply(df[-(1:2)],1,cumsum))==0] <- NA
df$mean_purchase <- rowMeans(df[-(1:2)],na.rm=T)
# id member_since X2014 X2015 X2016 X2017 mean_purchase
# 1 1 2014 2 3 3 2 2.500000
# 2 2 2016 NA NA 2 3 2.500000
# 3 3 2015 NA 4 3 6 4.333333
# 4 4 2014 3 2 4 0 2.250000
# If you really don't want to keep NAs :
df[is.na(df)] <- 0
一個選項是使用tidyr::gather
和dplyr::filter
來確保僅在member_since
之后的年份計算mean
。 實施可以如下:
library(tidyverse)
df %>% gather(year, value, -id, -member_since) %>%
filter(member_since <= as.numeric(gsub("^X(\\d+)","\\1",year))) %>%
group_by(id) %>%
summarise(mean = mean(value)) %>%
right_join(df, by="id") %>%
select(-mean, mean) %>% as.data.frame()
# id member_since X2014 X2015 X2016 X2017 mean
# 1 1 2014 2 3 3 2 2.50
# 2 2 2016 0 0 2 3 2.50
# 3 3 2015 0 4 3 6 4.33
# 4 4 2014 3 2 4 0 2.25
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.