1
votes

générer deux colonnes avec des valeurs aléatoires de 1,2 ou 3 mais différentes pour chaque ligne

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?


2 commentaires

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


5 Réponses :


1
votes

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)


0 commentaires

1
votes

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))


0 commentaires

1
votes
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

0 commentaires

1
votes

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)


0 commentaires

2
votes

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

Modifier

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


0 commentaires