2017-09-11 2 views
0

Considérez ce qui suit:propre façon de modifier l'ordre tidyr propagation après nid et carte purrr

library(tidyverse) 
library(broom) 

tidy.quants <- mtcars %>% 
    nest(-cyl) %>% 
    mutate(quantiles = map(data, ~ quantile(.$mpg))) %>% 
    unnest(map(quantiles, tidy)) 

tidy.quants 
#> # A tibble: 15 x 3 
#>  cyl names  x 
#> <dbl> <chr> <dbl> 
#> 1  6 0% 17.80 
#> 2  6 25% 18.65 
#> 3  6 50% 19.70 
#> 4  6 75% 21.00 
#> 5  6 100% 21.40 
#> 6  4 0% 21.40 
#> 7  4 25% 22.80 
#> 8  4 50% 26.00 
#> 9  4 75% 30.40 
#> 10  4 100% 33.90 
#> 11  8 0% 10.40 
#> 12  8 25% 14.40 
#> 13  8 50% 15.20 
#> 14  8 75% 16.25 
#> 15  8 100% 19.20 

Ce qui est grand et bien rangé, mais en tentant de se propager (ou passer à un terrain), les rendements de la colonne names dans un (peu) ordre inattendu:

tidy.quants %>% spread(names, x) 
#> # A tibble: 3 x 6 
#>  cyl `0%` `100%` `25%` `50%` `75%` 
#> * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 1  4 21.4 33.9 22.80 26.0 30.40 
#> 2  6 17.8 21.4 18.65 19.7 21.00 
#> 3  8 10.4 19.2 14.40 15.2 16.25 

ggplot(tidy.quants, aes(x = names, y = x, color = factor(cyl))) + 
    geom_point() 

enter image description here

est-il un moyen propre/idiomatiques d'avoir ont le names retourner dans leur ordre attendu? C'est, 0%, 25%, 50%, 75%, 100% au lieu de 0%, 100%, 25%, 50%, 75%?

Répondre

1

Vous pouvez essayer gtools::mixedsort, qui peut trier des chaînes avec des nombres incorporés; Après avoir obtenu les étiquettes triés par ordre mixedsort(unique(names)), semblable à color, vous pouvez faire names (axe x variable) un facteur avec les valeurs triées que les niveaux, ggplot devrait alors pouvoir afficher l'étiquette de l'axe x dans l'ordre correct:

library(gtools) 
ggplot(tidy.quants, aes(x = factor(names, levels = mixedsort(unique(names))), y = x, color = factor(cyl))) + 
    geom_point() + xlab('names') 

enter image description here


idée similaire pour spread:

tidy.quants %>% 
    mutate(names = factor(names, mixedsort(unique(names)))) %>% 
    spread(names, x) 

# A tibble: 3 x 6 
# cyl `0%` `25%` `50%` `75%` `100%` 
#* <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1  4 21.4 22.80 26.0 30.40 33.9 
#2  6 17.8 18.65 19.7 21.00 21.4 
#3  8 10.4 14.40 15.2 16.25 19.2 
1

Cela fonctionne parce que names déjà triés par quantiles:

tidy.quants <- mtcars %>% 
    nest(-cyl) %>% 
    mutate(quantiles = map(data, ~ quantile(.$mpg))) %>% 
    unnest(map(quantiles, tidy)) %>% 
    mutate(names=factor(names,unique(names))) 

tidy.quants %>% spread(names, x) 

résultat

# A tibble: 3 x 6 
    cyl `0%` `25%` `50%` `75%` `100%` 
* <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1  4 21.4 22.80 26.0 30.40 33.9 
2  6 17.8 18.65 19.7 21.00 21.4 
3  8 10.4 14.40 15.2 16.25 19.2