R 将客户群分成12个样本(=每月周期)
我需要将50万客户分成12个代表性样本,每月联系一次 12个样品应在产品和该产品的生命周期类别(A、B、C)内具有代表性。 意思是:我需要按产品id和生命周期类别(可以连接)按比例分层的样本。 我不仅需要一个样本,还需要整个人群分成12个样本 结果应该是原始表加上分层循环id(1-12) f、 e: 一个客户可以拥有多个产品,但组合客户产品是唯一的 在12个周期内,每个客户产品组合只能使用一次(因此,不得倒退) 我在R怎么做 示例数据行:R 将客户群分成12个样本(=每月周期),r,split,sample,R,Split,Sample,我需要将50万客户分成12个代表性样本,每月联系一次 12个样品应在产品和该产品的生命周期类别(A、B、C)内具有代表性。 意思是:我需要按产品id和生命周期类别(可以连接)按比例分层的样本。 我不仅需要一个样本,还需要整个人群分成12个样本 结果应该是原始表加上分层循环id(1-12) f、 e: 一个客户可以拥有多个产品,但组合客户产品是唯一的 在12个周期内,每个客户产品组合只能使用一次(因此,不得倒退) 我在R怎么做 示例数据行: cust_id, product, lifecycle
cust_id, product, lifecycle
10000, 4004, A
10000, 2000, B
10001, 3000, B
10002, 2000, A
10004, 4004, C
...
这是一个丑陋但实用的解决方案。我为这个奇怪、复杂的子集表示歉意,但不幸的是by()以一种非常奇怪的方式存储其数据
mysamp <- function(dat){
samp <- runif(length(dat)) #get 12 random numbers
samp <- ceiling(samp*12) #standardize between 1 and 12
return(samp)
}
然后,您需要创建一列0来放入cycle.id(在我的示例中,我将其称为“cyc”)。将其附加到data.frame,就像添加zz$prodlife一样。然后,您可以使用以下语句对样本进行采样,并将样本分配给列:
cycle <- by(newzz$cust, newzz$prodlife, mysamp)
for(i in 1:length(cycle)){
for(j in 1: length(cycle[i][[1]])){
zz$cyc[zz$prodlife == names(cycle)[i]][j] <- cycle[i][[1]][j]
}
}
当然,这个示例太小,无法判断样本是否正确分层,但这应该是可行的。快乐编码 在每个月内为
sample
行编写一个函数。然后使用ddply
或by
将函数应用于每个月度分组。如何确保12个样本具有代表性?您是否需要在同一个月内联系每种产品的回头客?还是不同的月份?这里是一个简单的第一步,将您的样本切割成12个随机样本,所有样本的大小大致相同:cut(sample(nrow(dat)),breaks=12,labels=FALSE)
其中您的数据命名为dat
Hi Liz,是的,我需要分层比例样本,不仅根据产品ID,还根据生命周期(a到C)。我还可以将两个字段连接到一个字段。你能用by()语句向我解释一下你的想法吗?谢谢,雷内里编辑了我的回答以回应你的评论。希望这澄清了我对by语句的意思——在这方面,我确实学会了使用by()是件多么烦人的事情!希望循环不会太慢,但是我想不出一个解决的办法。
cust <- c(101, 101, 102, 105, 107)
prod <- c(4004, 2000, 3000, 3000, 4004)
life <- c('A', 'B', 'B', 'B', 'A')
zz <- data.frame(cust, prod, life)
prodlife <- paste0(zz$prod, zz$life)
zz <- data.frame(zz, prodlife)
> zz
cust prod life prodlife
1 101 4004 A 4004A
2 101 2000 B 2000B
3 102 3000 B 3000B
4 105 3000 B 3000B
5 107 4004 A 4004A
cycle <- by(newzz$cust, newzz$prodlife, mysamp)
for(i in 1:length(cycle)){
for(j in 1: length(cycle[i][[1]])){
zz$cyc[zz$prodlife == names(cycle)[i]][j] <- cycle[i][[1]][j]
}
}
> zz
cust prod life prodlife cyc
1 101 4004 A 4004A 6
2 101 2000 B 2000B 5
3 102 3000 B 3000B 7
4 105 3000 B 3000B 8
5 107 4004 A 4004A 1