生成两列随机放置 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
我希望将 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