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

Il problema: Come posso ottenere i valori corretti nella funzione min() come parte di mutate() - in fondo, vorrei assegnare v3 come v1 divisa con il minimo di v1 e v2. Questo non funziona:R: usare min() all'interno dplyr :: mutare()

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

credo che mi manca qualcosa di veramente semplice.

+3

È possibile utilizzare 'pmin' ie' transform (df, v3 = ifelse (v1! = 0, v1/do.call (pmin, df), 0)) ' – akrun

+1

Qualsiasi motivo particolare per cui si carica il pacchetto' plyr' qui ? Non ricordo quale debba essere caricato per primo, ma in questo caso non dovresti caricare 'plyr'. –

+0

A destra, normalmente prima, ma qui è possibile caricare solo dplyr. – user3375672

risposta

18

Dalla pagina aiuto sul ?min:

pmax e pmin prelevare uno o più vettori (o matrici) come argomenti e restituire un singolo vettore dando i massimi 'parallela' (o minimi) del vettori.

D'altra parte:

max e min riportare il massimo o minimo di tutti i valori presenti nelle loro argomentazioni

Così si vuole utilizzare pmin qui. Con dplyr, una possibilità - come ha commentato in precedenza - è come questo:

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

Nizza effetto collaterale è che si può evitare di utilizzare ifelse e proprio mulitply con il vettore logica (VERO/FALSO che viene poi convertito in 1/0).

+2

Soluzione molto bella. –

Problemi correlati