Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将客户群分成12个样本(=每月周期)_R_Split_Sample - Fatal编程技术网

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

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

我需要将50万客户分成12个代表性样本,每月联系一次

12个样品应在产品和该产品的生命周期类别(A、B、C)内具有代表性。 意思是:我需要按产品id和生命周期类别(可以连接)按比例分层的样本。

我不仅需要一个样本,还需要整个人群分成12个样本

结果应该是原始表加上分层循环id(1-12)

f、 e:

一个客户可以拥有多个产品,但组合客户产品是唯一的

在12个周期内,每个客户产品组合只能使用一次(因此,不得倒退)

我在R怎么做

示例数据行:

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