2015-01-21 16 views
13
require(plyr) 
require(dplyr)  
set.seed(8) 
    df <- 
     data.frame(
     v1 = runif(10, -1,1), 
     v2 = runif(10, -1,1)) 

Problem: Jak mogę uzyskać poprawne wartości do funkcji min() jako część mutate() - w zasadzie, chciałbym przypisać v3 jak v1 podzielony z najmniejszym z v1 i v2. Ta praca nie robi:R: użyć min() w ciągu dplyr :: mutacji()

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

Myślę, że jestem brakuje czegoś naprawdę proste.

+3

Możesz użyć 'pmin' czyli' transform (df, v3 = ifelse (v1! = 0, v1/do.call (pmin, df), 0)) ' – akrun

+1

Dowolny szczególny powód, dla którego ładujesz tutaj pakiet' plyr' ? Nie pamiętam, który powinien być załadowany jako pierwszy, ale w tym przypadku nie powinieneś ładować 'plyr' w ogóle. –

+0

Najpierw normalnie plyr, ale tutaj można załadować tylko dplyr. – user3375672

Odpowiedz

18

Od strony pomocy na ?min:

Pmax i Pmin się jeden lub więcej wektorów (lub matryc) jako argumenty i powrotu pojedynczego wektora dające „równoległy” maksima (albo minima) w wektory.

Z drugiej strony:

max i min powrócić maksymalną lub minimalną wszystkich wartości występujących w ich argumenty

Więc chcesz użyć pmin tutaj. Z dplyr jedna opcja - jak skomentował powyżej - jest tak:

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

Nicea skutkiem ubocznym jest to, że można uniknąć stosując ifelse i tylko mulitply z logicznego wektora (PRAWDA/FAŁSZ, który jest następnie przekształcany do 1/0).

+2

Bardzo ładne rozwiązanie. –

Powiązane problemy