/namer

Manipulate objects by their names

Primary LanguageROtherNOASSERTION

R-CMD-check

{namer} is a tiny r package containing convenience functions for manipulating objects by their names. Using these functions makes your code easier to read, and reduces duplication:

library(namer)

vec <- c(One = 1, Two = 2, Three = 3, Four = 4)

# Base R:
vec[startsWith(names(vec), "T")]
#>   Two Three 
#>     2     3

# Clearer:
vec |> named_starting("T")
#>   Two Three 
#>     2     3


# Base R:
some_names <- names(vec) %in% c("Two", "Three")
names(vec)[some_names] <- tolower(names(vec)[some_names])

# Clearer:
vec |> rename_in(c("Two", "Three"), tolower)
#>   One   two three  Four 
#>     1     2     3     4


# Base R:
vec[sort(names(vec))]
#>  Four   One three   two 
#>     4     1     3     2

# Clearer:
vec |> sort_by_name()
#>  Four   One three   two 
#>     4     1     3     2

Functions that start with named return a subset of the original object:

vec <- c(One = 1, Two = 2, Three = 3, Four = 4)
vec |> named_in(c("Two", "Three", "Non-existent"))
#>   Two Three 
#>     2     3
vec |> named_starting("T")
#>   Two Three 
#>     2     3
vec |> named_like("[A-Z].*e$")
#>   One Three 
#>     1     3

sort_by_name() sorts object by name:

sort_by_name(vec)
#>  Four   One Three   Two 
#>     4     1     3     2

Functions that start with rename return the object with its names changed. You can use a named character vector:

vec |> rename_in(c("One", "Two"), c(one = "One", two = "Two"))
#>   one   two Three  Four 
#>     1     2     3     4

Or an unnamed character vector:

vec |> rename_in(c("One", "Two"), c("First", "Second"))
#>  First Second  Three   Four 
#>      1      2      3      4

Or a function:

vec |> rename_all(tolower)
#>   one   two three  four 
#>     1     2     3     4
vec |> rename_starting("T", tolower)
#>   One   two three  Four 
#>     1     2     3     4

Or you can use a one-sided formula, as in purrr:

vec |> rename_in(c("One", "Two"), ~paste(.x, 1:2, sep = "."))
#> One.1 Two.2 Three  Four 
#>     1     2     3     4

Or use a regular expression with rename_gsub:

vec |> rename_gsub("[aeiou]", "e")
#>   One   Twe Three  Feer 
#>     1     2     3     4

Or match names in a table with rename_match:

df <- data.frame(
        old = c("One", "Two", "Three", "Four"),
        new = c("A", "B", "C", "D")
      )
vec |> rename_match(df$old, df$new)
#> A B C D 
#> 1 2 3 4

Installation

You can install the development version from GitHub with:

# install.packages("devtools")
devtools::install_github("hughjonesd/namer")