The pmax and pmin R Functions | 3 Examples (How to Handle Warnings & NA)
In this tutorial, I will show you how to use the R functions pmax() and pmin(). I’ll explain both functions in the same article, since the R syntax of the two functions is exactly the same.
Basic R Syntax:
pmax(x1, x2) pmin(x1, x2)
The R pmax function returns the parallel maxima of two or more input vectors.
The R pmin function returns the parallel minima of two or more input vectors.
The basic R syntax for the pmax and pmin functions is illustrated above. In the following R tutorial, I’m going to show you three examples for the usage of pmax and pmin in R.
Let’s get started…
Example 1: Basic Application of pmax & pmin in R
Typically pmax and pmin are applied to two numeric vectors with the same length. Let’s create two example vectors:
x1 <- c(2, 8, 3, 4, 1, 5) # First example vector x2 <- c(0, 7, 5, 5, 6, 1) # Second example vector
Our vectors are named x1 and x2 and both of them consist of six numeric values.
Now, let’s apply the pmax R function to these vectors:
pmax(x1, x2) # Application of pmax in R # 2 8 5 5 6 5
As you can see, the R (or RStudio) output is a vector of the same length as the two input vectors (not as in case of max() and min(), were only one value is returned). Each of the numbers of this output vector is the parallel maximum of the two input vectors, i.e. 2 > 0; 8 > 7; 5 > 3; 5 > 4; 6 > 1; and 5 > 1.
The same works with the pmin R function. The only difference is that pmin calculates the parallel minimum of each pair of values:
pmin(x1, x2) # Application of pmin in R # 0 7 3 4 1 1
Looks good. So let’s move on to the next example…
Example 2: Warning! “an argument will be fractionally recycled”
A common R warning message returned by pmax and pmin is the following:
Warning message:
In pmax(x, y) : an argument will be fractionally recycled
I’ll show you why and when this happens. First, let’s create a new example vector:
x3 <- c(x2, 9, 3) # Third example vector (longer) x3 # Print example vector to RStudio console # 0 7 5 5 6 1 9 3
As you can see, the new example vector (called x3) consists of the same values as the previously used example vector x2, but with two additional values. Now, let’s apply pmax to x1 (created in Example 1) and the new vector x3:
pmax(x1, x3) # pmax for vectors with different length # 2 8 5 5 6 5 9 8
Figure 1: pmax() Warning Message for Vectors with Different Length.
We got an output – that’s good. However, we also got a warning message. Why?
The reason is that out two input vectors have a different length. While x3 consists of eight values, x1 contains only of six values.
For that reason, x1 has to be recycled to have the same length as x3, i.e. the first two values of x1 are compared with the last two values of x3.
Of cause, the same applies to pmin – just with recycled minima instead of maxima:
pmin(x1, x3) # pmin for vectors with different length # 0 7 3 4 1 1 2 3
That was basically the most confusing part for the pmax and pmin R commands. In the next example, I show you another typical issue with the two functions…
Example 3: pmax & pmin Return NA
For the next example, let’s create a new vector:
x4 <- x2 # Fourth example vector (with NA) x4[1] <- NA # Insert missing value at first position x4 # Print example vector to RStudio console # NA 7 5 5 6 1
As you can see, our new vector x4 contains the same numbers as x2, but the first value is NA. In R, NA stands for Not Available, i.e. the value is missing.
If we apply pmax to x1 (as created in Example 1) and the new vector x4, we get the following:
pmax(x1, x4) # Apply pmax to vector with NA # NA 8 5 5 6 5
Not only the first entry of x4 is NA. The first entry of the RStudio console output is NA as well.
The same happens, when we apply the R pmin function to these two vectors:
pmin(x1, x4) # Apply pmin to vector with NA # NA 7 3 4 1 1
OK, so what to do? Fortunately, there is an easy fix. Just specify na.rm = TRUE within the pmax…
pmax(x1, x4, na.rm = TRUE) # Specify na.rm = TRUE # 2 8 5 5 6 5
…and the pmin functions:
pmin(x1, x4, na.rm = TRUE) # Specify na.rm = TRUE # 2 7 3 4 1 1
AS you can see, the NA values are ignored and the available value in x1 (i.e. 2) is returned by both functions.
Easy peasy! But be aware that there are more options for the handling of NA – and that’s what I’m going to show you next…
Video & Further Resources
Have a look at the following video on my YouTube channel. In the video, I demonstrate the content of this tutorial:
Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.
If you accept this notice, your choice will be saved and the page will refresh.
In the previous example, I showed you how to remove NA values within the pmax and pmin functions via na.rm = TRUE. However, in your specific situation it might be better to replace NA values with other values, before the application of pmax or pmin. Have a look at the following video of my Statistical Programming YouTube channel. In the video, I’m showing you how to replace NA with 0 in R:
Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.
If you accept this notice, your choice will be saved and the page will refresh.
Further Reading
- The max & min Functions in R
- The R length Function
- The R is.na Function
- NA Values in R
- Replace NA by Zero in R
- The R Programming Language
Statistics Globe Newsletter
4 Comments. Leave new
Hi Joachim,
Thank you very much for these details explanations, everything is very clear.
I just want to point out a typo that can mislead R beginners:
In the Example 2 x3 is defined as :
x3 <- c(x2, 9, 3)
but what the console is returning is in fact
x3 <- (pmax(x1, x2), 9, 3)
Hope it helps.
In addition would you mind explaining a bit further the importance of the order pmax(y, z) vs pmax(z,y)?
I see in the R documentation that it can matters for names and labels but can't figure why.
Thank you very much!
Hey Louis,
Thank you very much for the hint! I have just fixed this typo, and it should be correct now. 🙂
Regarding your question: To be honest, I also don’t understand why it should be different. I have tried several different vectors, and it always returns the same result. Please let me know in case you find an example that returns different results, I’m also curious now!
Regards,
Joachim
Muchas gracias
You are very welcome, glad it was useful!
Regards,
Joachim