2015-04-03 9 views
8

Sono stato a lungo utente di reshape2::melt in un modo piuttosto non standard: eseguo esperimenti numerici e ottengo una matrice come risultato. Quindi lo sciolgo e produco alcune immagini.tidyr :: gather vs. reshape2 :: melt on matrici

Ispirato allo similarity tra reshape2 e tidyr, ora sto cercando di ottenere un output identico su oggetti di matrice di classe. Nessuna fortuna finora:

library(reshape2) 
library(tidyr) 

set.seed(42) 
mat <- matrix(runif(6), 3) 
mat2 <- mat 
colnames(mat2) <- letters[1:2] 
rownames(mat2) <- letters[3:5] 

melt(mat) 
melt(mat2) 
gather(mat) # fails 
gather(mat2) # fails 

noti che melt è intelligente e mantiene dimnames se sono presenti. Ho imparato how it works, in modo da poter potenzialmente aggiungere la seguente funzione al metodo di spedizione:

gather.matrix <- function(mat) { 
    if (is.null(dimnames(mat))) { 
    grid <- expand.grid(seq.int(nrow(mat)), seq.int(ncol(mat))) 
    } else { 
    grid <- expand.grid(dimnames(mat)) 
    } 
    cbind(grid, value = as.vector(mat)) 
} 

all.equal(melt(mat), 
      gather.matrix(mat)) 
#[1] TRUE 
all.equal(melt(mat2), 
      gather.matrix(mat2)) 
#[1] TRUE 

Ma la domanda è, posso forzare gather agire nello stesso modo in cui melt nel mio caso? Esiste una combinazione di parametri che possa produrre l'output desiderato su mat e mat2?

+0

Considerando che "tidyr è progettato per l'uso in congiunzione con dplyr "e che" dplyr "è" focalizzato sugli strumenti per lavorare con i frame di dati ", penso che potrebbe essere meglio attenersi a' melt' (in quanto 'gather' sembra essere un wrapper per' melt' comunque). – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Sono propenso a farlo davvero, mi chiedo solo se mi manca qualcosa di ovvio :) – tonytonov

+1

Se è davvero necessario un metodo 'gather', immagino di salvare te stesso la riscrittura e basta fare' gather.matrix <- reshape2 ::: melt.matrix' .... :-) – A5C1D2H2I1M1N2O1R2T1

risposta

11

Forse una risposta migliore emergerà, ma nel frattempo, io convertire i miei commenti a una risposta:

Citando dal README su "tidyr":

Si noti che è stato progettato tidyr per l'uso in combinazione con dplyr, quindi è necessario caricarli sempre entrambi.

... e dal README su "dplyr":

dplyr è la prossima iterazione del plyr, focalizzato sugli strumenti per lavorare con i frame di dati (da qui il d nel nome).

Come tale, sorta di senso di non disporre di metodi per matrici.


Dal gather avvolge già intorno melt, se si voleva davvero un metodo matrix, è possibile salvare a scrivere una funzione personalizzata e solo fare qualcosa di simile:

gather.matrix <- reshape2:::melt.matrix 
Problemi correlati