1
votes

Attribuer la même valeur aléatoire à l'ensemble d'une variable?

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?


1 commentaires

"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?


3 Réponses :


0
votes

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


3 commentaires

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!



1
votes

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


0 commentaires

0
votes

Nous pouvons utiliser data.table

library(data.table)
as.data.table(mtcars)[, rand :=  sample(c("A", "B", 1), cyl]


0 commentaires