Je cherche à affecter 3 lecteurs à une liste d'entrées avec ~ 1500 lignes. Chaque ligne doit être interrogée deux fois, mais pas de la même personne. Mon idée était de créer deux nouvelles colonnes dans l'ensemble de données avec 1,2 ou 3 aléatoirement mis pour les lecteurs respectifs. Mais les nombres doivent être différents pour chaque colonne.
Quelqu'un a-t-il une solution simple pour cela dans R?
5 Réponses :
si j'ai bien compris:
Vous pouvez vous 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)
Si vous êtes d'accord pour avoir des paires fixes dans chaque ligne, vous pouvez utiliser:
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
Ici, 1 et 2 se rencontreront toujours ensemble, 2 et 3 et 3 et 1. p >
Pour obtenir un résultat vraiment aléatoire où les valeurs ne se chevauchent pas:
df$col1 <- rep(1:3, length.out = nrow(df)) df$col2 <- rep(c(2, 3, 1), length.out = nrow(df))
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
Voici une solution base R :
> table(df$col1) 1 2 3 500 500 500 > table(df$col2) 1 2 3 750 500 250
Cela donne une distribution uniforme pour col1 et pas tellement pour col2 :
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)
Voici une fonction de base R.
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
Voici une autre solution.
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
Avez-vous essayé quelque chose? Si oui, veuillez poster le code. Publiez également des exemples de données et la sortie attendue.
Vous pouvez créer un vecteur
("1_2", "2_3", "1_3"), puiséchantillonà partir de celui-ci 1500 fois