2014-07-14 10 views
5

Durante il tentativo di rispondere a this question, ho riscontrato una differenza tra mutate e transform in quelle che mi aspettavo fossero operazioni equivalenti.Differenza tra dplyr: mutare e trasformare quando si usano pmin e pmax?

# data 
x <- data.frame(a=c(rep(0,10),rep(1,10),3),b=c(1:10,0,11:19,0)) 

#transform 
transform(x,a=pmin(a,b), b=pmax(a,b)) 
    a b 
1 0 1 
2 0 2 
3 0 3 
4 0 4 
5 0 5 
6 0 6 
7 0 7 
8 0 8 
9 0 9 
10 0 10 
11 0 1 
12 1 11 
13 1 12 
14 1 13 
15 1 14 
16 1 15 
17 1 16 
18 1 17 
19 1 18 
20 1 19 
21 0 3 

#mutate 
libarary(dplyr) 
x %>% mutate(a=pmin(a,b), b=pmax(a,b)) 
    a b 
1 0 1 
2 0 2 
3 0 3 
4 0 4 
5 0 5 
6 0 6 
7 0 7 
8 0 8 
9 0 9 
10 0 10 
11 0 0 
12 1 11 
13 1 12 
14 1 13 
15 1 14 
16 1 15 
17 1 16 
18 1 17 
19 1 18 
20 1 19 
21 0 0 

Nota le differenze di linee 11 e 21. Ho il sospetto che mutate sta mutando i dati come va e, pertanto, pmax non è vedere i dati originali. È corretto? È un bug o di progettazione?

+0

sei corretto, ed è di progettazione (c'è qualche discussione negli archivi, ho dimenticato dove). – baptiste

+0

@baptiste Grazie, penso di capire perché ora: consentire l'uso di variabili calcolate nello stesso comando, quindi è necessario fare riferimento agli originali in modo esplicito. – James

risposta

3

Risulta miei sospetti sono corretti, e che è alla progettazione per consentire l'uso di variabili calcolate subito dopo, per esempio:

data.frame(a=1:4,b=5:8) %>% mutate(sum=a+b, letter=letters[sum]) 
    a b sum letter 
1 1 5 6  f 
2 2 6 8  h 
3 3 7 10  j 
4 4 8 12  l 

Per riprodurre il comportamento atteso da transform uno deve fare riferimento semplicemente la variabile direttamente:

x %>% mutate(a=pmin(x$a,x$b), b=pmax(x$a,x$b)) 
    a b 
1 0 1 
2 0 2 
3 0 3 
4 0 4 
5 0 5 
6 0 6 
7 0 7 
8 0 8 
9 0 9 
10 0 10 
11 0 1 
12 1 11 
13 1 12 
14 1 13 
15 1 14 
16 1 15 
17 1 16 
18 1 17 
19 1 18 
20 1 19 
21 0 3 
+2

Non esplicitamente su 'pmin' e' pmax', ma si può leggere su questo comportamento nella [vignetta dplyr] (http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html): ' dplyr :: mutate() 'funziona allo stesso modo di' plyr :: mutate() 'e in modo simile a' base :: transform() '. La differenza chiave tra 'mutate()' e 'transform()' è che mutate ti permette di fare riferimento alle colonne che hai appena creato [la colonna 'a' nel tuo esempio] " – Henrik

+0

Potresti spiegare l'uso di%>% ? – Anusha

+0

C'è un errore di battitura: "Per replicare il comportamento atteso dalla trasformazione necessaria a". Si sta facendo riferimento a mutare, giusto? Grazie per avvisare di questa differenza. – Anusha