我需要将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
...
答案 0 :(得分:0)
这是一个丑陋但功能性的解决方案。我为奇怪的,复杂的子集道歉,但不幸的是()以非常奇怪的方式存储了它的数据。
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
当然,这个例子太小,无法判断样本是否正确分层,但这应该有效。快乐的编码!