Rob
Rob

Reputation: 649

min for each row in a data frame

I'm try to calculate minimum across multiple columns (row-wise min) in a data frame, but the min function automatically returns the minimum across the whole of each column rather than for each row separately. I'm sure I'm missing something really simple here? Any ideas much appreciated.

x <- c(1,2,7)
y <- c(1,5,4)
minIwant <- c(1,2,4)
df <- data.frame(x, y, minIwant)
df$minIget <- min(df$x,df$y)
df
  x y minIwant minIget
1 1 1        1       1
2 2 5        2       1
3 7 4        4       1

Upvotes: 37

Views: 78313

Answers (4)

nico
nico

Reputation: 51680

You can use apply to go through each row

apply(df, 1, FUN = min)

Where 1 means to apply FUN to each row of df, 2 would mean to apply FUN to columns.

To remove missing values, use:

apply(df, 1, FUN = min, na.rm = TRUE)

Upvotes: 54

Rich Scriven
Rich Scriven

Reputation: 99381

We could use pmin, which finds the parallel minima of sets of values. Since our df is technically a list, we will need to run it via do.call.

df$min <- do.call(pmin, df)

which gives

df
#   x y min
# 1 1 1   1
# 2 2 5   2
# 3 7 4   4

Data:

df <- data.frame(x = c(1, 2, 7), y = c(1, 5, 4))

Furthermore, if na.rm = TRUE is needed, you can do

df$min <- do.call(pmin, c(df, na.rm = TRUE))

Upvotes: 19

Nik Muhammad Naim
Nik Muhammad Naim

Reputation: 588

Just want to add on how you can also do this with dplyr.

library(dplyr)

x<-c(1,2,7)
y<-c(1,5,4)
df <- data.frame(x,y)

df %>% rowwise() %>% mutate(minIget = min(x, y))
# A tibble: 3 x 3
    x     y   minIget
  <dbl> <dbl>   <dbl>
1    1.    1.      1.
2    2.    5.      2.
3    7.    4.      4.

Upvotes: 8

akrun
akrun

Reputation: 887951

We could also use rowMins from library(matrixStats)

library(matrixStats)
df$minIwant <- rowMins(as.matrix(df))

Upvotes: 4

Related Questions