使用split-apply-combine策略分配测试/控制组向量

时间:2016-09-13 19:55:55

标签: r random

这应该很简单,但它让我把头发拉出来!

以下是一些数据:

Clicks <- c(1,2,3,4,5,6,5,4,3,2)
Cost <- c(10,11,12,13,14,15,14,13,12,11)
Cluster <- c(1,1,1,2,2,1,1,1,1,1)
df <- data.frame(Clicks,Cost,Cluster)

我想按群集过滤我的df,分配一个随机分配“test”和“control”组的新向量,然后重新组合到原始数据框

步骤1:过滤(按群集1)

  Clicks Cost Cluster
1      1   10       1
2      2   11       1
3      3   12       1
4      6   15       1
5      5   14       1
6      4   13       1
7      3   12       1
8      2   11       1

步骤2:随机分配测试和控制组

  Clicks Cost Cluster   group
1      1   10       1    Test
2      2   11       1 Control
3      3   12       1 Control
4      6   15       1    Test
5      5   14       1 Control
6      4   13       1 Control
7      3   12       1    Test
8      2   11       1 Control

第3步:返回原始数据框

   Clicks Cost Cluster   group
1       1   10       1    Test
2       2   11       1 Control
3       3   12       1 Control
4       4   13       2    NULL
5       5   14       2    NULL
6       6   15       1    Test
7       5   14       1 Control
8       4   13       1 Control
9       3   12       1    Test
10      2   11       1 Control

步骤4:对群集2执行相同的操作

谢谢:)

1 个答案:

答案 0 :(得分:0)

怎么样

df$Group <- 'NULL'

df1 <- df
df1[df1$Cluster==1, ]$Group <- ifelse(runif(sum(df1$Cluster==1)) > 0.5, 'Control', 'Test')
df1
   Clicks Cost Cluster   Group
1       1   10       1    Test
2       2   11       1    Test
3       3   12       1    Test
4       4   13       2    NULL
5       5   14       2    NULL
6       6   15       1 Control
7       5   14       1    Test
8       4   13       1    Test
9       3   12       1 Control
10      2   11       1 Control

df2 <- df
df2[df2$Cluster==2, ]$Group <- ifelse(runif(sum(df2$Cluster==2)) > 0.5, 'Control', 'Test')
df2
 Clicks Cost Cluster   Group
1       1   10       1    NULL
2       2   11       1    NULL
3       3   12       1    NULL
4       4   13       2    Test
5       5   14       2 Control
6       6   15       1    NULL
7       5   14       1    NULL
8       4   13       1    NULL
9       3   12       1    NULL
10      2   11       1    NULL