3
votes

Créer une liste pseudo-aléatoire avec r

Étant donné que j'ai 4 valeurs différentes

intensities <- c(0.1,-0.1,0.05,-0.05)

Mon objectif est d'échantillonner au hasard chaque valeur 5 fois, mais les valeurs positives et négatives doivent alterner, par exemple

resultantList = (0,1 , -0.05, 0.05, -0.05, 0.1, -0.1, ...)

Est-ce que quelqu'un connaît une manière élégante de faire cela en R?

r

1 commentaires

Qu'entendez-vous par «échantillonnage aléatoire chaque valeur 5 fois»? Si vous échantillonnez au hasard parmi les 4 valeurs, il n'y a aucune garantie que les valeurs +/- moins seront également distribuées. Donc, alterner complètement la séquence peut être impossible.


3 Réponses :


2
votes

Peut-être quelque chose comme ça

# seed
set.seed(123)

plus <- rep(intensities[intensities >= 0], each = 5)
minus <- rep(intensities[intensities < 0], each = 5)
out <- numeric(length(plus) + length(minus))
out[seq(1, length(out), 2)] <- sample(plus)
out[seq(2, length(out), 2)] <- sample(minus)
out
# [1]  0.10 -0.05  0.05 -0.10  0.10 -0.05  0.05 -0.05  0.05 -0.10  0.10 -0.05  0.05 -0.05  0.05 -0.10
# [17]  0.10 -0.10  0.10 -0.10


0 commentaires

0
votes

C'est ma solution, qui crée une fonction personnalisée et l'argument n signifie la longueur de la sortie. De plus, plafond () et floor () peuvent décider de la longueur des positions paires et impaires.

mySample <- function(x, n){
  res <- c()
  res[seq(1, n, 2)] <- sample(x[x >= 0], ceiling(n / 2), T)
  res[seq(2, n, 2)] <- sample(x[x < 0], floor(n / 2), T)
  return(res)
}

intensities <- c(0.1, -0.1, 0.05, -0.05)
mySample(intensities, 10)
# [1]  0.10 -0.10  0.05 -0.05  0.10 -0.05  0.05 -0.05  0.05 -0.10


0 commentaires

0
votes

Si votre liste d'intensités à partir de laquelle vous échantillonnez vient en +/- paires, vous pouvez simplement échantillonner dans la liste des valeurs positives puis changer le signe de chaque autre nombre tiré:

N <- 5
positiveIntensities <- c(0.1, 0.05)
resultingList <- sample(positiveIntensities,N,replace = T) * (-1)^(0:(N-1))

p>


2 commentaires

J'y ai pensé aussi. Le problème avec cela est que nous n'obtenons pas le même nombre de valeurs négatives 0,05 et 0,1


Ahh, j'ai mal compris cette contrainte.