How to extract the row with min or max values?

117,489

Solution 1

You can include your which.max call as the first argument to your subsetting call:

df[which.max(df$Temp),]

Solution 2

A (relatively new) alternative is to use slice_max (or slice_min) from the tidyverse. Using mtcars as example:

library(tidyverse)
mtcars %>% slice_max(mpg)
#                 mpg cyl disp hp drat    wt qsec vs am gear carb
# Toyota Corolla 33.9   4 71.1 65 4.22 1.835 19.9  1  1    4    1

mtcars %>% slice_min(mpg)
#                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
# Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4

Note that slice_max and slice_min give you all the rows, which have a max or min value in the specified column (like the call mtcars[mtcars$mpg == min(mtcars$mpg), ]. So if you only want the first row (like in the call mtcars[which.min(mtcars$mpg), ]), you need to slice once again like:

mtcars %>% slice_min(mpg) %>% slice(1)
#                     mpg cyl disp  hp drat   wt  qsec vs am gear carb
# Cadillac Fleetwood 10.4   8  472 205 2.93 5.25 17.98  0  0    3    4

Moreover, slice also offers a few more helper functions for common use cases like slice_head, slice_tail and slice_sample.

Solution 3

You could also use a subset and max function to call the row:

df[df$Temp == max(df$Temp),]
Share:
117,489
matteo
Author by

matteo

Updated on October 16, 2020

Comments

  • matteo
    matteo over 3 years

    With a dataframe like this one:

            ID  Year    Temp    ph
    1       P1  1996    11.3    6.80
    2       P1  1996    9.7     6.90
    3       P1  1997    9.8     7.10
    ...
    2000    P2  1997    10.5    6.90
    2001    P2  1997    9.9     7.00
    2002    P2  1997    10.0    6.93
    

    if I want to know where the max value is I type:

    which.max(df$Temp)
    

    and R print the index of the row, for example 665.

    So, if I want to read and extract the column with all the related values, I have to type:

    df[665, ]
    

    Isn't there a simpler way to know which ID is related to the max value of a specific column of the df?

  • Jay Schyler Raadt
    Jay Schyler Raadt about 6 years
    what if the vector is bimodal?
  • Joshua Ulrich
    Joshua Ulrich about 6 years
    @JaySchylerRaadt: see Gabor's comment. Though you might need to be careful if Temp is a double.
  • its.me.adam
    its.me.adam almost 3 years
    Using the n = argument, slice_max can also show you rows corresponding to the top n values in the specified column.