2017-06-07 3 views
0

Ich versuche, die Faktorstufen einer Variablen innerhalb jeder Untergruppe der Variablen basierend auf einer dritten Variablen neu anordnen, aber ich bekomme einen Fehler .Mit purrr :: map und forcats :: fct_reorder um Faktorstufen nach jeder Untergruppe neu zu ordnen

Ich erkenne, das ist ein wenig schwierig ohne Kontext zu verstehen, so dass ich den gapminder Datensatz verwenden, um zu veranschaulichen. Hier mag ich die Faktorstufen des country Variable neu zu ordnen innerhalb jeder Kategorie der continent Variable basierend auf der Größe des pop Variable:

library(gapminder) 
library(tidyverse) 
library(forcats) 

gapminder %>% 
    filter(year == 2007) %>% 
    group_by(continent) %>% 
    nest() %>% 
    mutate(newdata = map(data, fct_reorder, country, pop)) %>% 
    unnest(newdata) 
Error in mutate_impl(.data, dots) : 
`f` must be a factor (or character vector). 

Was mache ich falsch ?

+0

Seit 'data' ein data.frame ist, können Sie Syntax bräuchten wie' Gapminder :: Gapminder%>% Filter (Jahr == 2007)%>% group_by (Kontinent)%>% Nest() %>% mutiere (newdata = map (Daten, ~ mutate (.x, country = forcats :: fct_reorder (Land, pop))))%>% unnest (newdata) ', aber du hast immer noch den Konflikt Ebenen Problem, das unten erwähnt wird. Sie sollten mit Ihrem größeren Ziel bearbeiten; es könnte einen besseren Ansatz geben. – alistaire

+0

Danke @alistaire. Ich lehne mich jetzt auf "manuell" zu, um die Ebenen der Faktoren in einem separaten Vektor zu erstellen, um das Problem insgesamt zu vermeiden. – Phil

+0

Worauf kommt es bei der Verwendung von Faktoren an? Neben dem Festlegen von Aufträgen in Plots oder dem manuellen Einstellen von Kontrasten für ein Modell sind Strings in der Regel genauso oder besser geeignet. – alistaire

Antwort

0

Ich nicht wirklich jetzt forcats und seine fct_* Funktionen, stocherte ich herum und fand keinen Weg zu erreichen, was Sie wollen. Allerdings können wir es mit erhalten:

library(gapminder) 
library(tidyverse) 

gapminder %>% 
    filter(year == 2007) %>% 
    group_by(continent) %>% 
    nest() %>% 
    mutate(newdata = map(data, ~{ 
    .x$country <- reorder(.x$country, order(.x$pop, decreasing = TRUE)) 
    .x 
    }) 
) -> res 
res 
#> # A tibble: 5 × 3 
#> continent    data   newdata 
#>  <fctr>   <list>   <list> 
#> 1  Asia <tibble [33 × 5]> <tibble [33 × 5]> 
#> 2 Europe <tibble [30 × 5]> <tibble [30 × 5]> 
#> 3 Africa <tibble [52 × 5]> <tibble [52 × 5]> 
#> 4 Americas <tibble [25 × 5]> <tibble [25 × 5]> 
#> 5 Oceania <tibble [2 × 5]> <tibble [2 × 5]> 

Wir können bestätigen, dass die Faktorstufen wirklich verändert:

lapply(res$newdata, function(x) as.numeric(x$country)) 
#> [[1]] 
#> [1] 5 7 8 23 3 12 24 31 9 30 15 20 1 21 25 10 18 14 29 33 27 28 4 
#> [24] 6 11 13 26 32 17 22 19 16 2 
#> 
#> [[2]] 
#> [1] 11 29 10 30 16 26 20 22 18 12 21 3 7 23 13 27 2 28 5 8 24 9 19 
#> [24] 4 6 15 1 25 17 14 
#> 
#> [[3]] 
#> [1] 37 15 18 11 44 45 47 24 33 1 50 21 34 28 13 7 5 29 36 2 52 41 30 
#> [24] 51 49 9 22 43 39 6 3 42 27 48 17 8 12 31 26 35 25 20 4 23 19 32 
#> [47] 46 38 10 16 14 40 
#> 
#> [[4]] 
#> [1] 23 3 16 6 1 4 20 25 5 10 12 8 9 2 13 14 11 19 17 7 21 24 18 
#> [24] 15 22 
#> 
#> [[5]] 
#> [1] 1 2 

Danach kann man nicht wirklich unnest es, als das Land Faktor ‚-Liste 'für jede continent würde mit den anderen in Konflikt geraten:

res %>% 
    select(-data) %>% 
    unnest() -> res2 
sapply(res2$country, as.numeric) 
#> [1] 5 7 8 23 3 12 24 31 9 30 15 20 1 21 25 10 18 
#> [18] 14 29 33 27 28 4 6 11 13 26 32 17 22 19 16 2 34 
#> [35] 39 40 43 46 60 62 63 72 73 76 78 84 85 86 87 99 103 
#> [52] 108 112 113 116 120 122 123 126 129 130 135 137 35 36 41 44 47 
#> [69] 48 49 51 52 55 56 57 59 64 67 69 70 71 74 75 77 80 
#> [86] 81 89 90 91 92 93 94 95 96 97 100 101 102 106 107 115 117 
#> [103] 118 119 121 124 125 127 128 131 132 134 136 141 142 37 42 45 50 
#> [120] 53 54 58 61 65 66 68 79 82 83 88 98 105 109 110 111 114 
#> [137] 133 138 139 140 38 104 

ich denke, sie ag neu geordnet werden ain der Reihe nach.

+0

"Danach kann man es nicht wirklich auflösen, da der Faktor" Liste "für jeden Kontinent mit den anderen kollidieren würde" Natürlich ... Ich weiß nicht, was ich über dieses Problem nicht dachte. Hmm, zurück zum Zeichenbrett. – Phil

Verwandte Themen