我需要将500.000名客户分成12个有代表性的样本,每月与他们联系。
这12个样品应具有代表性的产品和生命周期的产品类别(A,B,C)。的意思是:我需要按产品id和生命周期类分层比例样本(可以连接)。
我需要的不仅仅是一个样本,还有12个样本。
结果应该是添加分层循环id(1-12)的起源表。
f.e.:
cust_id, product, lifecycle, NEW: cycle_id
10000, 4004, A, 3
10000, 2000, B, 6
10001, 3000, B, 12一个客户可以欠几个产品,但是组合的客户产品是独一无二的.
每个客户产品组合只需在12个周期内使用一次(因此不放回)。
我怎样才能在R中做到这一点?
样本数据行:
cust_id, product, lifecycle
10000, 4004, A
10000, 2000, B
10001, 3000, B
10002, 2000, A
10004, 4004, C
...发布于 2012-07-03 15:29:11
这是一个丑陋但实用的解决方案。我为奇怪而复杂的细分表示歉意,但不幸的是,by()以一种非常奇怪的方式存储其数据。
mysamp <- function(dat){
samp <- runif(length(dat)) #get 12 random numbers
samp <- ceiling(samp*12) #standardize between 1 and 12
return(samp)
}这是你将你的种群划分成12个样本的函数。现在说“zz”是您的数据集:
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然后,您需要创建一个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]
}
}by()语句在做所有的工作,可怕的for循环只是将采样的值分配给正确的点。因为'by‘类的设置不方便,所以我想不出一个更有效的方法来完成这个任务,但也许其他人可以.?无论如何,这给了我:
> 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当然,这个例子太小,无法判断样本是否被正确地分层,但这应该是可行的。编码愉快!
https://stackoverflow.com/questions/11309723
复制相似问题