2017-08-29 6 views
0

Avoir une telle trame de données:aléatoirement affecter des valeurs différentes à des lignes à l'aide de différentes probabilités dans R

ID var 
1 NA 
2 NA 
3 NA 
4 NA 
... 

je besoin d'attribuer au hasard var valeurs de 20 lignes de% à être A, et 30% de lignes à B, et 50% des rangées doivent être en C.

Existe-t-il un moyen efficace de résoudre ce problème?

+3

'échantillon (c ("A", "B", "C"), nrow (df), prob = c (0.2, 0.3, 0.5), replace = TRUE) 'échantillonne aléatoirement, mais parce que c'est aléatoire vous ne vous retrouvez pas avec une division exacte de 20/30/50 - Avez-vous besoin d les proportions exactes ou voulez-vous échantillonner selon ces probabilités? – Marius

Répondre

0

supposons que vous avez df nommé dataframe: alors vous pouvez écrire:

randvar = sample(c('A','B','C'),size = nrow(df),prob = c(0.2,0.3,0.5),replace = TRUE) 
df$var = randvar 

Supposons que vous voulez que le "A" est à juste titre 20% pour cent, alors ne "B" à 30% et "C" dans 50% alors il n'est pas un code de ligne, supposons que votre c (0.2,0.3,0.5) * df_size est tout entier ma réponse est:

n = nrow(df) 
df$var = "C" #initialize all value to be "C" 
index = 1:n 
indexa = sample(index,0.2*n) #pick 20% index for "A" 
indexb = sample(index[-indexa],0.3*n) #pick 30% index for "B" need to rule out the "A"s you already picked 
df$var[indexa] = "A" #assign "A" to df$var at indexa 
df$var[indexb] = "B" #assign "B" to df$var at indexb 
#the rest 50% is "C" 
+0

et si c (0.2,0.3,0.5) * df_size n'est pas un nombre entier, vous devez arrondir (0.2 * n) pour remplacer 0.2 * n, arrondir (0.3 * n) remplacer 0.3 * n, et ainsi de suite – cloudscomputes