forcats::fct_shift

Function of the Week

Shift factor levels to left or right, wrapping around at end
Author

Danielle Higbee

Published

February 28, 2024

1 forcats::fct_shift

In this document, I will introduce the ’fct_shift` function and show what it’s for.

#load tidyverse up
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.3     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.3     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
pacman::p_load(
  tidyverse,    # data management + ggplot2 graphics 
  readxl,       # import excel data
  here,         # helps with file management
  janitor,       # for data cleaning, making tables
  skimr,
  titanic       # needed to use the titanic dataset
  )

#install 'forcats'
#install.packages("forcats")
library(forcats) #load forcats package
library(datasets) #load built in datasets to r

#example dataset
data("Orange")
data("titanic_train")

1.1 What is it for?

Discuss what the function does. Learn from the examples, but show how to use it using another dataset such as penguins. If you can provide two examples, even better!

Shift factor levels left or right, wrapping around at the end.

1.1.1 Arguments

This function is from the ‘forcats’ package and is used to shift levels in a factor. The following is the syntax:

Syntax

\(\text{f = A factor}\)

\(\text{n = positive values shift to the left; negative values shift to the right}\)

1.1.1.1 Example Shift to Left

Shift Left

1.1.1.2 Example Shift to Right

Shift Right

1.1.2 Example given

x <- factor(
  c("Mon", "Tue", "Wed"),
  levels = c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"),
  ordered = TRUE
)
x
[1] Mon Tue Wed
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
fct_shift(x) #default to shift left 1
[1] Mon Tue Wed
Levels: Mon < Tue < Wed < Thu < Fri < Sat < Sun
fct_shift(x, 2)
[1] Mon Tue Wed
Levels: Tue < Wed < Thu < Fri < Sat < Sun < Mon
fct_shift(x, -1)
[1] Mon Tue Wed
Levels: Sat < Sun < Mon < Tue < Wed < Thu < Fri

1.1.3 Example with ‘Orange’ dataset

glimpse(Orange)
Rows: 35
Columns: 3
$ Tree          <ord> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,…
$ age           <dbl> 118, 484, 664, 1004, 1231, 1372, 1582, 118, 484, 664, 10…
$ circumference <dbl> 30, 58, 87, 115, 120, 142, 145, 33, 69, 111, 156, 172, 2…
factor(Orange$Tree)
 [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5
Levels: 3 < 1 < 5 < 2 < 4
Orange$Tree <- factor(Orange$Tree,
    levels = c("1", "2", "3", "4", "5"))

levels(Orange$Tree)
[1] "1" "2" "3" "4" "5"
tabyl(Orange$Tree)
 Orange$Tree n percent
           1 7     0.2
           2 7     0.2
           3 7     0.2
           4 7     0.2
           5 7     0.2
fct_shift(Orange$Tree) # default to shift 1 left
 [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5
Levels: 2 < 3 < 4 < 5 < 1
fct_shift(Orange$Tree, 1) # shift left
 [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5
Levels: 2 < 3 < 4 < 5 < 1
fct_shift(Orange$Tree, -1) # shift right
 [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5
Levels: 5 < 1 < 2 < 3 < 4
fct_shift(Orange$Tree, 4)
 [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5
Levels: 5 < 1 < 2 < 3 < 4

1.1.4 Example with ‘Titanic’ dataset

glimpse(titanic_train)
Rows: 891
Columns: 12
$ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
$ Survived    <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1…
$ Pclass      <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3…
$ Name        <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
$ Sex         <chr> "male", "female", "female", "female", "male", "male", "mal…
$ Age         <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, …
$ SibSp       <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0…
$ Parch       <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0…
$ Ticket      <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37…
$ Fare        <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
$ Cabin       <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C…
$ Embarked    <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"…

Titantic Voyage Map
factor(titanic_train$Embarked)
  [1] S C S S S Q S S S C S S S S S S Q S S C S S Q S S S C S Q S C C Q S C S C
 [38] S S C S S C C Q S Q Q C S S S C S C S S C S S C   S S C C S S S S S S S C
 [75] S S S S S S S S Q S S S S S S S S S S S S S C C S S S S S S S S S S S Q S
[112] C S S C S Q S C S S S C S S C Q S C S C S S S S C S S S C C S S Q S S S S
[149] S S S S S S S C Q S S S S S S S S S S S S S S Q S S C S S C S S S C S S S
[186] S Q S Q S S S S S C C Q S Q S S S S C S S S C Q C S S S S Q C S S C S S S
[223] S S S S S S S S S S S S S S S S S S C Q S S C Q S S S S S S S S S C C S C
[260] S Q S S S Q S S S S S S S S C Q S S S Q S Q S S S S C S S S Q S C C S S C
[297] C S S C Q Q S Q S S C C C C C C S S S S S S S C S S Q S S C S S S C Q S S
[334] S S S S C S S S S S S S S S S S S S S C S C S S S Q Q S C C S Q S C C Q C
[371] C S S C S C S C C S C C S S S S S S Q C S S S C S S S S S S S S S S S S S
[408] S S S S Q Q S S S S S S S C Q S S S S S S Q S S S S S S S S S S S S S S S
[445] S S S S C S S S C C S C S S S Q S S S S S S S S Q C S S S C S S S S S S S
[482] S S S C S S C S S S S S C S C C S S S S Q Q S S C S S S S Q S S C S S S Q
[519] S S S S C C C Q S S S S S C C C S S S C S C S S S S C S S C S S C S Q C S
[556] S C C S S Q S S S S S S S C S S S S Q S S S S C S S C S C C S S C S S S C
[593] S Q S S S S C C S S S S C S S S C S S S Q Q S S S S S S C S C S S S Q S S
[630] Q S S C S S S S S S S S C S S C C S C S S S S S Q Q S S Q S C S C S S S S
[667] S S S S S S S S S S S S S C Q C S S S C S S S S S C S C S S S Q C S C S C
[704] Q S S S S S C C S S S S S C S Q S S S S S S S S Q S S S C S S S S S C S S
[741] S S C S S S S S S Q S S S S S S S S S S S S C S S S C Q Q S S S S C S S Q
[778] S Q S C S S S S S S Q S C Q S S C S S S S C S S S S C S S S S S S S S S S
[815] S S S C S S S S S S S Q S C Q   C S C S S C S S S C S S C C S S S C S C S
[852] S C S S S S S C C S S S S S S C S S S S S S S C C S S S C S S S S S Q S S
[889] S C Q
Levels:  C Q S
titanic_train$Embarked <- factor(titanic_train$Embarked,
  levels = c("C", "Q", "S")
)

levels(titanic_train$Embarked)
[1] "C" "Q" "S"

Levels are in alphabetical order.

We want the ‘Embarked’ column to be in order of the actual voyage of the Titanic. Southampton > Cherbourg > Queenstown

fct_shift(titanic_train$Embarked, -1)
  [1] S    C    S    S    S    Q    S    S    S    C    S    S    S    S    S   
 [16] S    Q    S    S    C    S    S    Q    S    S    S    C    S    Q    S   
 [31] C    C    Q    S    C    S    C    S    S    C    S    S    C    C    Q   
 [46] S    Q    Q    C    S    S    S    C    S    C    S    S    C    S    S   
 [61] C    <NA> S    S    C    C    S    S    S    S    S    S    S    C    S   
 [76] S    S    S    S    S    S    S    Q    S    S    S    S    S    S    S   
 [91] S    S    S    S    S    S    C    C    S    S    S    S    S    S    S   
[106] S    S    S    S    Q    S    C    S    S    C    S    Q    S    C    S   
[121] S    S    C    S    S    C    Q    S    C    S    C    S    S    S    S   
[136] C    S    S    S    C    C    S    S    Q    S    S    S    S    S    S   
[151] S    S    S    S    S    C    Q    S    S    S    S    S    S    S    S   
[166] S    S    S    S    S    S    Q    S    S    C    S    S    C    S    S   
[181] S    C    S    S    S    S    Q    S    Q    S    S    S    S    S    C   
[196] C    Q    S    Q    S    S    S    S    C    S    S    S    C    Q    C   
[211] S    S    S    S    Q    C    S    S    C    S    S    S    S    S    S   
[226] S    S    S    S    S    S    S    S    S    S    S    S    S    S    S   
[241] C    Q    S    S    C    Q    S    S    S    S    S    S    S    S    S   
[256] C    C    S    C    S    Q    S    S    S    Q    S    S    S    S    S   
[271] S    S    S    C    Q    S    S    S    Q    S    Q    S    S    S    S   
[286] C    S    S    S    Q    S    C    C    S    S    C    C    S    S    C   
[301] Q    Q    S    Q    S    S    C    C    C    C    C    C    S    S    S   
[316] S    S    S    S    C    S    S    Q    S    S    C    S    S    S    C   
[331] Q    S    S    S    S    S    S    C    S    S    S    S    S    S    S   
[346] S    S    S    S    S    S    S    C    S    C    S    S    S    Q    Q   
[361] S    C    C    S    Q    S    C    C    Q    C    C    S    S    C    S   
[376] C    S    C    C    S    C    C    S    S    S    S    S    S    Q    C   
[391] S    S    S    C    S    S    S    S    S    S    S    S    S    S    S   
[406] S    S    S    S    S    S    Q    Q    S    S    S    S    S    S    S   
[421] C    Q    S    S    S    S    S    S    Q    S    S    S    S    S    S   
[436] S    S    S    S    S    S    S    S    S    S    S    S    S    C    S   
[451] S    S    C    C    S    C    S    S    S    Q    S    S    S    S    S   
[466] S    S    S    Q    C    S    S    S    C    S    S    S    S    S    S   
[481] S    S    S    S    C    S    S    C    S    S    S    S    S    C    S   
[496] C    C    S    S    S    S    Q    Q    S    S    C    S    S    S    S   
[511] Q    S    S    C    S    S    S    Q    S    S    S    S    C    C    C   
[526] Q    S    S    S    S    S    C    C    C    S    S    S    C    S    C   
[541] S    S    S    S    C    S    S    C    S    S    C    S    Q    C    S   
[556] S    C    C    S    S    Q    S    S    S    S    S    S    S    C    S   
[571] S    S    S    Q    S    S    S    S    C    S    S    C    S    C    C   
[586] S    S    C    S    S    S    C    S    Q    S    S    S    S    C    C   
[601] S    S    S    S    C    S    S    S    C    S    S    S    Q    Q    S   
[616] S    S    S    S    S    C    S    C    S    S    S    Q    S    S    Q   
[631] S    S    C    S    S    S    S    S    S    S    S    C    S    S    C   
[646] C    S    C    S    S    S    S    S    Q    Q    S    S    Q    S    C   
[661] S    C    S    S    S    S    S    S    S    S    S    S    S    S    S   
[676] S    S    S    S    C    Q    C    S    S    S    C    S    S    S    S   
[691] S    C    S    C    S    S    S    Q    C    S    C    S    C    Q    S   
[706] S    S    S    S    C    C    S    S    S    S    S    C    S    Q    S   
[721] S    S    S    S    S    S    S    Q    S    S    S    C    S    S    S   
[736] S    S    C    S    S    S    S    C    S    S    S    S    S    S    Q   
[751] S    S    S    S    S    S    S    S    S    S    S    S    C    S    S   
[766] S    C    Q    Q    S    S    S    S    C    S    S    Q    S    Q    S   
[781] C    S    S    S    S    S    S    Q    S    C    Q    S    S    C    S   
[796] S    S    S    C    S    S    S    S    C    S    S    S    S    S    S   
[811] S    S    S    S    S    S    S    C    S    S    S    S    S    S    S   
[826] Q    S    C    Q    <NA> C    S    C    S    S    C    S    S    S    C   
[841] S    S    C    C    S    S    S    C    S    C    S    S    C    S    S   
[856] S    S    S    C    C    S    S    S    S    S    S    C    S    S    S   
[871] S    S    S    S    C    C    S    S    S    C    S    S    S    S    S   
[886] Q    S    S    S    C    Q   
Levels: S C Q
titanic_train %>% 
  mutate(Embarked = fct_shift(Embarked, -1)) %>% 
  tabyl(Embarked)
 Embarked   n     percent valid_percent
        S 644 0.722783389    0.72440945
        C 168 0.188552189    0.18897638
        Q  77 0.086419753    0.08661417
     <NA>   2 0.002244669            NA

1.2 Is it helpful?

Discuss whether you think this function is useful for you and your work. Is it the best thing since sliced bread, or is it not really relevant to your work?

This function is helpful! Instead of having to rewrite the entire order of the levels of a factor, you can easily use ‘fct_shift’ to reorder. However, it should be noted that this is useful when ordered factors are cyclical. So cannot work if you are pulling out a singular factor level to place somewhere else.

Citation for titanic dataset: https://cran.r-project.org/web/packages/explore/vignettes/explore_titanic.html

Citation for titantic voyage picture: https://en.m.wikipedia.org/wiki/File:Titanic_voyage_map.png