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
?
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
@AnandaMahto Sono propenso a farlo davvero, mi chiedo solo se mi manca qualcosa di ovvio :) – tonytonov
Se è davvero necessario un metodo 'gather', immagino di salvare te stesso la riscrittura e basta fare' gather.matrix <- reshape2 ::: melt.matrix' .... :-) – A5C1D2H2I1M1N2O1R2T1