2017-08-23 1 views
1

D'autres questions et réponses est possible de comprendre comment échantillonner aléatoirement "n" lignes d'un df, ou "n" lignes qui proviennent d'un niveau spécifique d'un facteur dans une df . Cependant je n'ai pas trouvé comment sélectionner toutes les rangées des niveaux "n" aléatoires d'un DF.Sélection de toutes les lignes à partir des niveaux aléatoires d'un df

Voici un df de travail.

df <- data.frame(matrix(rnorm(80), nrow=40)) 
df$color <- rep(c("blue", "red", "yellow", "pink","purple","brown","green","olive"), each=5) 
df$color <-as.factor(df$color) 

Ce que je veux faire est d'obtenir un autre df avec un échantillon aléatoire avec toutes les 5 rangées de 4 couleurs.

Répondre

1

On peut d'abord filter l'ensemble de données basé sur la 'couleur' ​​que nous voulions et slice le sample d row_number()

library(dplyr) 
df %>% 
    filter(color %in% sample(unique(color), 4)) %>% 
    slice(sample(row_number())) 

NOTE: On ne sait pas si le doit être 'couleur' ​​sample d comme bien. Donc, nous avons inclus que dans la filter étape

Nous pouvons créer une fonction basée sur la

ci-dessus
fSample <- function(dat, colr, n) { 
     colr <- enquo(colr) 
     dat %>% 
      filter(UQ(colr) %in% sample(unique(UQ(colr)), n)) %>% 
      slice(sample(row_number())) 
} 

fSample(df, color, 4) 
+0

OK, Merci! Je vois comment ça fonctionne. Cependant j'ai un problème, je dois obtenir toutes les lignes du niveau que Im échantillonnant ... Dans mon jeu de données réel je ne peux pas spécifier combien de lignes comme vous faites (sample_n (1)), puisque chaque niveau a différent nombre de rangées et j'ai besoin de tous. Si je supprime cette ligne (sample_n (1)) le script ne fonctionne plus. Ok, j'ai compris, tout a supprimé tout inclus le dernier%>%. Merci – Cisco

+0

@Cisco Je l'ai changé. Maintenant, vous obtiendrez toutes les lignes de la couleur filtrée – akrun

+0

Im ayant une erreur bizarre avec dplyr ... Mon R n'a pas trouvé enquo() alors je réinstalle Dplyer et ai obtenu ceci: Erreur dans loadNamespace (i, c (lib.loc, .libPaths()), versionCheck = vI [[i]]): namespace 'DBI' 0.3.1 est en cours de chargement, mais> = 0.4.1 est requis En outre: Message d'avertissement: Le package 'dplyr' a été créé sous R version 3.2.5 Erreur: le chargement du package ou de l'espace de noms a échoué pour 'dplyr – Cisco