如何随机化R中列中的值的顺序,但保持唯一值的特定平衡?

时间:2018-03-16 14:33:20

标签: r

我真的很感激这方面的一些帮助!我想创建一个包含4列的数据表:

ROUTE SCENE REPEAT CONTEXT
  A    1     1      YES
  A    2     1      NO
  A    3     1      NO 

每条路线有6条路线(A-F)和10个路线(1-10)。每条路线需要重复10次,因此REPEAT列的值为1-10,如下所示:

ROUTE SCENE REPEAT CONTEXT
  A    1     1      YES
  A    2     1      NO
  A    3     1      NO
  .
  .
  B    1     1      NO
  B    2     1      YES
  .
  .
  A    1     2      NO
  A    2     2      YES
  A    3     2      YES   

数据表中总共有600行。

我正在努力获得正确的CONTEXT专栏。对于每个路径(A-F),5行CONTEXT列必须具有值YES,5行必须具有值NO,但是以随机顺序。此外,在每个路线A-F的所有10次迭代中,每个唯一场景必须出现5次,CONTEXT = YES,5次出现CONTEXT = NO。例如:

ROUTE SCENE REPEAT CONTEXT
  A    1     1      YES
  .
  A    1     2      NO
  .
  A    1     3      YES
  .    
  A    1     4      NO 
  .
  .
  A    1     10     NO    

这就是我试图做的事情:

library(data.table)

randomiser <- function(i,j){

     context_combo <- rep(c('YES','NO'), 5)

     set <- data.table(
     ROUTE = i,
     SCENE = seq(1:10),
     REPEAT = j,
     CONTEXT = sample(context_combo, size = 10, replace = FALSE))


     return(set)

}

i = rep(rep(c("A","B","C","D","E","F"), each = 10), 10)
j = rep(c(1:10), each = 60)

newDT <- randomiser(i,j)

然而,对于ROUTE的每个值和整个数据表中REPEAT的每个值,这给出了与CONTEXT相同的“是/否”序列。我不知道如何更改代码,以便每个路径的YES / NO顺序是随机的,因此对于每个路径的所有10次迭代中的每个场景,有5个CONTEXT = YES和5个CONTEXT =没有。

1 个答案:

答案 0 :(得分:0)

IIUC,您希望创建一个YES和NO的上下文列,每个列随机抽样5次。你可以这样做:

# sample data
df <- data.table(route = rep(LETTERS[1:6], each=10), scene = rep(1:10, 6))

# result
df[,context := sample(rep(c('YES','NO'), each=5)),.(route)]

head(df, 10)

    route scene context
 1:     A     1      NO
 2:     A     2      NO
 3:     A     3     YES
 4:     A     4      NO
 5:     A     5     YES
 6:     A     6     YES
 7:     A     7     YES
 8:     A     8      NO
 9:     A     9      NO
10:     A    10     YES
11:     B     1     YES
12:     B     2     YES
13:     B     3     YES
14:     B     4      NO
15:     B     5      NO