R 随机抽样表格单元格-行和列中的N相等

R 随机抽样表格单元格-行和列中的N相等,r,random,sampling,R,Random,Sampling,我计划让12个人回答300个问题。每个主题将回答100个问题,每个问题由4个主题回答 由于各种原因,分配必须是随机的。以下是我的做法,但我愿意接受任何想法 我创建了一个300*12的空白数据框(300行以问题ID命名,12列为主题)。对于每个主题列,随机抽取100行,并在100个单元格中填入“1”。因此,我可以确保每个主题随机分配到100个问题,但并非所有问题都由4个主题回答。因为这是社区生态学中出现的一个问题(生成带有观察到的边缘的“空社区”),您可以使用permatswap()完成素食者套餐

我计划让12个人回答300个问题。每个主题将回答100个问题,每个问题由4个主题回答

由于各种原因,分配必须是随机的。以下是我的做法,但我愿意接受任何想法


我创建了一个300*12的空白数据框(300行以问题ID命名,12列为主题)。对于每个主题列,随机抽取100行,并在100个单元格中填入“1”。因此,我可以确保每个主题随机分配到100个问题,但并非所有问题都由4个主题回答。

因为这是社区生态学中出现的一个问题(生成带有观察到的边缘的“空社区”),您可以使用
permatswap()完成
素食者套餐中的功能

生成具有所需边距的二进制矩阵(非随机)矩阵:

basemat <- matrix(0,nrow=300,ncol=12)
nq <- 100  ## number of questions
qs <- ncol(basemat)*nq/nrow(basemat) ## q per subject
for (i in 1:ncol(basemat)) {
    basemat[1:100+(nq*((i-1) %/% qs)),i]  <- 1
}
## check margins
all(rowSums(basemat)==qs)
all(colSums(basemat)==nq)

basemat@ben bolker的答案要优雅得多,但我想我应该发布我的答案,因为我已经把它编码好了。这个想法是模仿一个人如果手动完成任务可能会做什么。我们创建一个从1到300的数字池,每个数字重复4次。然后,受试者1在不替换的情况下绘制100个数字,如果绘制了受试者1已经绘制的数字,则重新绘制。然后受试者2也这样做,我们一直重复到受试者11

N <- 12
K <- 100
set.seed(123)

pool <- rep(1:300, each = 4)
assignments <- vector("list", N)
for (i in 1:(N - 1)) {
  for (j in 1:K) {
    repeat {
      draw <- sample(pool, 1)
      if (!(draw %in% assignments[[i]]))
        break
    }
    assignments[[i]] <- c(assignments[[i]], draw)
    pool <- pool[-which(pool == draw)[1]]
  }
}
assignments[[N]] <- pool

N这正是我迫切想要的!非常感谢。我也会像你建议的那样深入研究技术问题。在这里发布之前,我像你一样把它编码到主题11,然后在电子表格中手动处理主题12。你的答案也很完美,为我节省了很多时间。非常感谢。
N <- 12
K <- 100
set.seed(123)

pool <- rep(1:300, each = 4)
assignments <- vector("list", N)
for (i in 1:(N - 1)) {
  for (j in 1:K) {
    repeat {
      draw <- sample(pool, 1)
      if (!(draw %in% assignments[[i]]))
        break
    }
    assignments[[i]] <- c(assignments[[i]], draw)
    pool <- pool[-which(pool == draw)[1]]
  }
}
assignments[[N]] <- pool
dupes <- assignments[[N]][duplicated(assignments[[N]])]
for (k in 1:length(dupes)) {
  fixed <- FALSE
  xx <- dupes[k]
  counter <- 1
  while (!fixed) {
    if (!(xx %in% assignments[[counter]])) {
      swap <- setdiff(assignments[[counter]], assignments[[N]])[1]
      assignments[[N]][which(assignments[[N]] == xx)[1]] <- swap
      assignments[[counter]][which(assignments[[counter]] == swap)[1]] <- xx
      cat(sprintf("Swapped %d for %d with Subject %d\n", xx, swap, counter))
      fixed <- TRUE
    } else {
      counter <- counter + 1
    }
  }
}
mat <- matrix(0, nc = 300, nr = 12)
for (i in 1:N) {
  for (j in 1:K) {
    mat[i, assignments[[i]][j]] <- 1
  }
}
unique(rowSums(mat))
# [1] 100
unique(colSums(mat))
# [1] 4