One of our readers commented on our mode exercises post: “What real world tasks are you using mode to solve?” I think it’s an interesting question, from a somewhat larger perspective. Obviously, it’d be a waste of time to learn all kinds of obscure commands that don’t have a clear application in the real world. Fortunately, that’s not the case with the mode function, and its cousins, as we’ll see shortly.
If you’re new to R, you might be particularly interested in getting up to speed quickly, and focus on those commands that produce a graph, table, or prediction, or jump straight to some of the popular packages that offer the latest data science toys.
If this approach works for you, great! Many R beginners will suffer unnecessarily however, by taking this route. Why? Read on…
R and Italian, an analogy
Consider this analogy between learning R and learning a real language (as in, Italian or Chinese). Real languages have words that convey strong, clear messages (“Water”, “Money”, “Sleep”), as well al words that play a more supportive role (“you need”, “A little”, “Enough”), and words that may convey even less information (“Actually”, “Apparently”). (For more analogies like these, read this post on the ideas behind our exercise sets).
Likewise, R has commands that carry out big, important tasks with a lot of immediate practical value (plot
, glm
, table
), as well as commands that play a more supportive role (data.frame
, cut
, as.Date
).
Master the full R vocabulary
My point is this: You need both the strong words/big commands, and the more supportive words/commands to get something done in practice, whether it’s in Italian (like, communicating: “Apparently, you need a little sleep”) or in R (like: reading some data, cleaning it, running a model and plotting the results).
Many basic R functions, like mode
, play this supportive role. In and of itself, they don’t have much practical value, but they are important little nuts and bolts that are indispensable to get your ultimate task done. And are therefore important to master, as part of your R vocabulary!
Practical uses of mode, some examples
Ok, so let’s get back to the original question and look at some practical uses of mode
. Looking through some of my recent code, I noticed, I mostly use mode
to convert characters to numbers and vice versa, and to check input values in functions.
Ex. 1: Data cleaning
For example, your raw data might have typos or wrong characters, as in the following example, where the last element of the input vector contains the letter ‘o’, instead of the zero digit. Such data can only be read as character, so after reading it into R, you’d have something like the vector x below. Using this vector in a calculation would throw an error.
x <- c('20', '30', '4o') # raw data, x <- gsub('o', '0', x) # cleaning mode(x) <- 'numeric' # convert from character to numeric x + 1 # we can now use x in calculations
## [1] 21 31 41
Ex. 2: Checking input values
Another example of practical use of mode is to check input values in functions. Consider the sum
function, which requires arguments of type numeric or logical. It will stop your script if it receives a character, e.g. sum(10, 'a')
. Suppose this is not what you want. Instead you want a sum function that would simply return NA when it receives a character, without stopping the script. In that case you can use is.numeric()
to check input values:
mysum <- function(a, b) { if(is.numeric(a) & is.numeric(b)) a + b else NA } mysum(10, 20)
## [1] 30
mysum(10, 'a')
## [1] NA
Ex. 3: Subsetting
Finally, an example that involves subsetting of a table. Here we convert a numeric range (2005:2010) to character, to select a few columns (representing years) of a table:
df <- data.frame(years=1991:2010, v=sample(1:10, 20000, T)) mytable <- with(df, table(v, years)) # a cross-table with counts mytable[, as.character(2005:2010)]
## years ## v 2005 2006 2007 2008 2009 2010 ## 1 92 108 115 110 90 119 ## 2 101 82 91 98 103 90 ## 3 96 99 93 89 84 100 ## 4 99 107 92 103 108 97 ## 5 99 99 118 118 104 81 ## 6 94 89 93 89 95 108 ## 7 104 125 108 111 115 95 ## 8 116 85 100 97 108 101 ## 9 109 95 94 91 89 102 ## 10 90 111 96 94 104 107
Do you have other examples of practical uses of mode
? Feel free to share below as a comment!
Having used R for some years now, I did not realize there was a ‘mode’ command. For Ex. 1. I used as.numeric() and for typechecking typeof(). I wonder, If you see advantages oder disadvantages of any of this over mode().
Apart from that, I like the language analogy!
Bernhard
Agreed. I think the `mode` example is still very artificial, `as,numeric()` is the natural way to perform that operation – just like `as.character()` is used later in the post rather than an intermediate `mode()` step. I’ve been using R for 7 years and I’ve never had a case where I’ve needed `mode()`, I just know it as a novelty for not being the statistical mode.
Hi Bernard and Greg,
I agree. I mostly use the as.numeric and as.character functions, instead of the mode() function. It appears using mode() to change the mode is much slower than using these other functions. I think using the mode() function is helpful for showing the mode of an object, or to set the mode based on a variable (e.g. mode(x) <- a, where a is could be 'numeric', 'character' etc.). But even this latter example is quite artificial. The point of the post was not so much to focus attention on the mode() function, but rather on the mode concept, i.e. a property of an R object.
Great work guys! I was wondering (as a native Italian) if the analogy is due to the difficulty of learning Italian, which in fact is a really difficult language to learn. By the way, I didn’t know as well about mode(), I will certainly use it in the future! Cheers
Thank you.
I appreciate you taking the time to answer my question on mode.