生成两列随机放置 1,2 或 3 但每行的值不同

generating two columns with randomly put 1,2 or 3 but different values for each row

我希望将 3 位读者分配到包含 ~1500 行的条目列表。每行需要调查两次,但不能来自同一个人。我的想法是在数据集中创建两个新列,并为各自的读者随机放置 1,2 或 3。但是每列的数字需要不同。

有人在 R 中找到了解决这个问题的简单方法吗?

如果我没理解错的话:

您可以使用sample()

nums1 = c(1,2,3)
df$col1 = sample(nums1, length(df), replace = T)


nums2 = c(4,5,6)
df$col2 = sample(nums2, length(df), replace = T)

如果您可以在每一行中使用固定对,则可以使用:

df$col1 <- rep(1:3, length.out = nrow(df))
df$col2 <- rep(c(2, 3, 1), length.out = nrow(df))

这里1和2总会相遇,2和3和3和1


要获得值不重叠的真正随机结果:

set.seed(123)
df <- data.frame(x = 1:10)
df$col1 <- sample(1:3, nrow(df), replace = TRUE)
df$col2 <- sapply(df$col1, function(x) sample(setdiff(1:3, x), 1))
df

#    x col1 col2
#1   1    3    2
#2   2    3    2
#3   3    3    2
#4   4    2    1
#5   5    3    2
#6   6    2    1
#7   7    2    3
#8   8    2    1
#9   9    3    1
#10 10    1    2
library(arrangements)
library(tidyverse)

x <- permutations(3, 2, nsample=1500)
d <- tibble(ID=1:1500, Reader1=x[,1], Reader2=x[,2])
d
# A tibble: 1,500 x 3
      ID Reader1 Reader2
   <int>   <int>   <int>
 1     1       3       2
 2     2       2       1
 3     3       3       2
 4     4       2       3
 5     5       3       1
 6     6       1       2
 7     7       2       3
 8     8       1       2
 9     9       3       2
10    10       2       1
# … with 1,490 more rows

这是一个 base R 解决方案:

df <- data.frame(ID = rep(1:1500))
vec <- c(1,2,3)
df$col1 <- rep(1:3, length.out = nrow(df))
df$col2[df$col1 == 1] <- rep(2:3)
df$col2[df$col1 == 2] <- rep(1,3)
df$col2[df$col1 == 3] <- rep(1:2)

这为 col1 提供了均匀分布,而 col2 则没有那么多:

> table(df$col1)

  1   2   3 
500 500 500 

> table(df$col2)

  1   2   3 
750 500 250 

这是一个基本的 R 函数。

readers <- function(r, n){
  ex <- expand.grid(Reader.1 = seq_len(r), Reader.2 = seq_len(r))
  ex <- ex[ex[, 1] != ex[, 2], ]
  ex <- ex[sample(nrow(ex), n, TRUE), ]
  row.names(ex) <- NULL
  ex
}

set.seed(2020)
readers(3, n = 15)
#   Reader.1 Reader.2
#1         3        2
#2         3        2
#3         2        3
#4         2        1
#5         2        1
#6         3        2
#7         3        1
#8         2        3
#9         2        1
#10        1        3
#11        3        1
#12        3        1
#13        2        3
#14        1        3
#15        3        1

编辑

这是另一个解决方案。

readers2 <- function(r, n){
  df <- data.frame(Reader.1 = rep(seq_len(r), length.out = n))
  i1 <- seq(1, n, by = 3)
  i2 <- seq(2, n, by = 3)
  i3 <- seq(3, n, by = 3)
  df$Reader.2 <- NA_integer_
  df$Reader.2[i1] <- sample(2:3, length(i1), TRUE)
  df$Reader.2[i2] <- sample(c(1L,3L), length(i2), TRUE)
  df$Reader.2[i3] <- sample(1:2, length(i3), TRUE)
  df
}

set.seed(2020)
df <- readers2(3, 1500)
table(df$Reader.1)
#
#  1   2   3 
#500 500 500 

table(df$Reader.2)
#
#  1   2   3 
#505 479 516 

table(df)
#        Reader.2
#Reader.1   1   2   3
#       1   0 239 261
#       2 245   0 255
#       3 260 240   0