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