En utilisant mtcars comme exemple, j'essaie de créer une nouvelle colonne et d'assigner toutes les mêmes valeurs de cyl à une même valeur aléatoire.
J'ai essayé:
mtcars$cyl <- as.factor (mtcars$cyl) mtcars %>% group_by(cyl) %>% mutate (rand = sample( c("A", "B"), replace = T)
Cependant, la longueur semble être fausse, et je ne suis pas sûr que cela attribue simplement un A ou B aléatoire à chaque ligne au lieu du même A ou B aléatoire au même facteur de cyl. Une idée, devrais-je créer une boucle for pour chaque (cyl) unique?
3 Réponses :
Compte tenu de votre précision, je pense qu'une solution simple consiste à utiliser une fusion . Vous générez d'abord un dataframe
associant des cyl
s avec une valeur aléatoire puis fusionnez en utilisant cyl
merge(df, dfrand, by = "cyl")[sample(1:nrow(df), size = 5)] cyl mpg disp hp drat wt qsec vs am gear carb rand 1: 8 13.3 350.0 245 3.73 3.84 15.41 0 0 3 4 B 2: 4 24.4 146.7 62 3.69 3.19 20.00 1 0 4 2 A 3: 8 17.3 275.8 180 3.07 3.73 17.60 0 0 3 3 B 4: 4 32.4 78.7 66 4.08 2.20 19.47 1 1 4 1 A 5: 4 22.8 108.0 93 3.85 2.32 18.61 1 1 4 1 A
Et puis vous fusionnez. Vous pouvez utiliser la base R
dplyr::left_join( df, dfrand, by = 'cyl' )
ou dplyr
:
merge(df, dfrand, by = "cyl")
Le résultat devrait ressembler à ce qui suit (je prends 5 lignes aléatoires du dataframe généré)
dfrand <- data.frame( rand = sample(c("A","B"), size = length(unique(df$cyl)), replace = TRUE), cyl = unique(df$cyl), stringsAsFactors = FALSE ) dfrand rand cyl 1 B 6 2 A 4 3 B 8
Pour clarifier, je veux attribuer à toutes les mêmes valeurs de cyl la même variable aléatoire. c'est à dire. si cyl = 4 est A, alors tous les cyl = 4 sont A. Les méthodes suggérées attribuent aléatoirement toutes les lignes indépendamment de leur valeur cyl.
Ok, je comprends mieux. La sortie est-elle ce que vous voulez?
Oui merci! J'essayais de penser à des moyens de tout mettre dans une seule fonction, mais je suppose que leur attribuer de manière unique, puis fusionner est le moyen le plus clair!
Vous devez spécifier la taille 1 dans échantillon
pour obtenir la même valeur de cyl
la même valeur aléatoire.
library(dplyr) set.seed(567) mtcars %>% group_by(cyl) %>% mutate(rand = sample(c("A", "B"), 1)) # mpg cyl disp hp drat wt qsec vs am gear carb rand # <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> # 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 B # 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 B # 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 A # 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 B # 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 A # 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 B # 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 A # 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 A # 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2 A #10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4 B # ⦠with 22 more rows
Nous pouvons utiliser data.table
library(data.table) as.data.table(mtcars)[, rand := sample(c("A", "B", 1), cyl]
"J'essaye de créer une nouvelle colonne et d'assigner toutes les mêmes valeurs de cyl à une même valeur aléatoire." : qu'entendez-vous par là? En fait je vous ai proposé quelque chose en fonction de votre code mais est-ce cohérent avec ce que vous voulez?