R: используйте min() в dplyr :: mutate()

require(plyr)
require(dplyr)    
set.seed(8)
    df <- 
      data.frame(
        v1 = runif(10, -1,1),
        v2 = runif(10, -1,1))

Проблема: как я могу получить правильные значения в функции min() как часть mutate() - в основном, я хотел бы назначить v3 как v1 деленный на наименьший из v1 и v2. Это не работает:

  df <- 
         df %>% mutate(v3=ifelse(v1 !=0, v1/min(v1,v2), 0))

Наверное, мне не хватает чего-то очень простого.

Ответ 1

На странице справки на ?min:

pmax и pmin принимают один или несколько векторов (или матриц) в качестве аргументов и возвращают один вектор, дающий "параллельные максимумы (или минимумы) векторов.

С другой стороны:

max и min возвращают максимум или минимум всех значений, присутствующих в их аргументах

Поэтому вы хотите использовать pmin здесь. С dplyr, один из вариантов - как указано выше - выглядит следующим образом:

df %>% mutate(v3 = (v1 != 0) * v1/pmin(v1,v2))

Хорошим побочным эффектом здесь является то, что вы можете избежать использования ifelse и просто mulitply с логическим вектором (TRUE/FALSE, который затем преобразуется в 1/0).