将客户群分成12个样本(=每月周期)

时间:2012-07-03 11:12:55

标签: r split sample

我需要将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
...

1 个答案:

答案 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

当然,这个例子太小,无法判断样本是否正确分层,但这应该有效。快乐的编码!