Import your data

data <- read_excel("../00_data/myData.xlsx")

Chapter 15

Create a factor

region_levels <- c(
  "PW", "NE", "IM", "SE", "NT", "NC", 
  "MW", "AK"
)
region_levels
## [1] "PW" "NE" "IM" "SE" "NT" "NC" "MW" "AK"

Modify factor order

Before reordering

# Transform data calculate average visitors by region
visitors_by_region <- data %>%
    
    group_by(region) %>%
    summarise(
        avg_visitors = mean(visitors, na.rm = TRUE)
    )

# plot 

visitors_by_region %>%
    
    ggplot(aes(x = avg_visitors, y = region)) +
    geom_point()

After reordering

visitors_by_region %>%
    
    ggplot(aes(x = avg_visitors, y = fct_reorder(.f = region, .x = avg_visitors))) +
    geom_point() +
    
    # Labeling
    labs(y = NULL, x = "Mean Number of National Park Visitors")

Modify factor levels

Show examples of three functions:

  • fct_recode
  • fct_collapse
  • fct_lump
visitors_by_region %>%
    
    ggplot(aes(x = avg_visitors, 
               y = fct_reorder(.f = region, .x = avg_visitors) %>%
                   fct_relevel("NT"))) +
    geom_point() +
    
    # Labeling
    labs(y = NULL, x = "Mean Number of National Park Visitors")

data %>% distinct(region)
## # A tibble: 8 × 1
##   region
##   <chr> 
## 1 PW    
## 2 NE    
## 3 IM    
## 4 SE    
## 5 NT    
## 6 NC    
## 7 MW    
## 8 AK
# Recode
data %>%
    
    # Rename levels
    mutate(region_rev = fct_recode(region, "Northeast" = "NE")) %>%
    select(region, region_rev) %>%
    filter(region == "NE")
## # A tibble: 3,710 × 2
##    region region_rev
##    <chr>  <fct>     
##  1 NE     Northeast 
##  2 NE     Northeast 
##  3 NE     Northeast 
##  4 NE     Northeast 
##  5 NE     Northeast 
##  6 NE     Northeast 
##  7 NE     Northeast 
##  8 NE     Northeast 
##  9 NE     Northeast 
## 10 NE     Northeast 
## # … with 3,700 more rows
# Collapse multiple levels into one
data %>%
    
    mutate(region_col = fct_collapse (region, "Eastern" = c("NE", "SE"))) %>%
    select(region, region_col) %>%
    filter(region != "PW")
## # A tibble: 18,309 × 2
##    region region_col
##    <chr>  <fct>     
##  1 NE     Eastern   
##  2 IM     IM        
##  3 NE     Eastern   
##  4 IM     IM        
##  5 SE     Eastern   
##  6 SE     Eastern   
##  7 NT     NT        
##  8 NE     Eastern   
##  9 SE     Eastern   
## 10 SE     Eastern   
## # … with 18,299 more rows
# Lump small levels into other levels
data %>% count(region)
## # A tibble: 8 × 2
##   region     n
##   <chr>  <int>
## 1 AK      1040
## 2 IM      5765
## 3 MW      2635
## 4 NC      1579
## 5 NE      3710
## 6 NT        77
## 7 PW      3251
## 8 SE      3503
data %>% mutate(region_lump = fct_lump(region)) %>% distinct(region_lump)
## # A tibble: 7 × 1
##   region_lump
##   <fct>      
## 1 PW         
## 2 NE         
## 3 IM         
## 4 SE         
## 5 Other      
## 6 NC         
## 7 MW