AME
AME

Reputation: 349

Mutate to Create Minimum in Each Row

I have a question relating to creating a minimum value in a new column in dplyr using the mutate function based off two other columns.

The following code repeats the same value for each row in the new column. Is there a way to create an independent minimum for each row in the new column? I wish to avoid using loops or the apply family due to speed and would like to stick with dplyr if possible. Here's the code:

a = data.frame(runif(5,0,5))
b = data.frame(runif(5,0,5))
c = data.frame(runif(5,0,5))

y = cbind(a,b,c)

colnames(y) = c("a","b","c")

y = mutate(y, d = min(y$b, y$c))

y

The new column "d" is simply a repeat of the same number. Any suggestions on how to fix it so that it's the minimum of "b" and "c" in each row?

Thank you for your help.

Upvotes: 7

Views: 4601

Answers (2)

bschneidr
bschneidr

Reputation: 6277

You could make the min function apply by rows rather than columns by using the apply function and setting the margin argument to MARGIN = 1. Your rowwise min function would look like this:

apply(y, MARGIN = 1, FUN = function(x) min(x)))

Then, in order to make the rowwise min function only apply to columns b and c, you could use the select function within mutate, like this:

y %>% mutate(b.c.min = 
  y %>%
    select(one_of("b", "c")) %>%
    apply(MARGIN = 1, FUN = function(x) min(x)))

Upvotes: 0

akrun
akrun

Reputation: 887911

We can use pmin

y$d <- with(y, pmin(b, c))

Or

transform(y, d = pmin(b,c))

Or with dplyr

library(dplyr)
y %>%
  mutate(d = pmin(b,c))

min works columnwise, suppose if we want to use min, an option would be

y %>%
  rowwise %>% 
  mutate(d = min(unlist(c(b,c))))

Upvotes: 8

Related Questions