2015-04-03 4 views
8

मैं reshape2::melt का एक लंबे समय तक गैर-मानक तरीके से उपयोगकर्ता रहा हूं: मैं संख्यात्मक प्रयोग चला रहा हूं और परिणामस्वरूप मैट्रिक्स प्राप्त कर रहा हूं। मैं फिर इसे पिघला और कुछ छवियों का उत्पादन।tidyr :: इकट्ठा बनाम reshape2 :: matrices पर पिघला

reshape2 और tidyr के बीच प्रेरित, अब मैं कक्षा मैट्रिक्स की वस्तुओं पर समान आउटपुट प्राप्त करने की कोशिश कर रहा हूं। कोई भाग्य अब तक:

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 

ध्यान दें कि melt चालाक है और dimnames रहता है अगर वे मौजूद हैं। मैं how it works सीखा है, तो मैं संभवतः विधि प्रेषण के लिए निम्न समारोह जोड़ सकते हैं:

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 

लेकिन सवाल है, मैं अपने मामले में melt के रूप में एक ही तरीके से gather अधिनियम मजबूर कर सकते हैं? क्या पैरामीटर का कोई संयोजन है जो वांछित आउटपुट mat और mat2 पर उत्पादन करेगा?

+0

dplyr के साथ संयोजन में "और" dplyr "" डेटा फ्रेम के साथ काम करने के लिए उपकरण पर केंद्रित है ", मुझे लगता है कि आप 'पिघला' के साथ चिपकने से बेहतर हो सकते हैं (क्योंकि 'इकट्ठा' वैसे भी 'पिघलने' के लिए एक रैपर लगता है)। – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto मैं वास्तव में ऐसा करने के इच्छुक हूं, बस सोच रहा हूं कि मुझे कुछ स्पष्ट याद आ रही है :) – tonytonov

+1

यदि कोई 'इकट्ठा' विधि वास्तव में जरूरी है, तो मुझे लगता है कि खुद को फिर से लिखना चाहिए और बस 'collect.matrix <- reshape2 ::: melt.matrix' .... :-) – A5C1D2H2I1M1N2O1R2T1

उत्तर

11

शायद एक बेहतर जवाब उभरेगा, लेकिन इस बीच में, मैं एक जवाब के लिए मेरी टिप्पणी बदल देंगे:

README से करने के लिए "tidyr" का हवाला देते हुए:

ध्यान दें कि tidyr डिज़ाइन किया गया है dplyr के संयोजन के रूप में उपयोग के लिए, तो आप हमेशा दोनों लोड करना चाहिए।

... और README करने के लिए "dplyr" से:

dplyr plyr की अगले चरण, डेटा फ्रेम के साथ काम करने के लिए उपकरण पर ध्यान केंद्रित (इसलिए नाम में d) है।

इस प्रकार, यह की तरह समझ में आता है मैट्रिक्स के लिए विधि नहीं है।


gather के बाद से पहले से ही चारों ओर melt लपेटता, यदि आप वास्तव में एक matrix तरीका चाहते थे, तुम अपने आप को एक कस्टम समारोह लेखन को बचा सकता है और बस की तरह कुछ कार्य करें: यह देखते हुए कि "tidyr उपयोग के लिए डिज़ाइन किया गया है

gather.matrix <- reshape2:::melt.matrix 
संबंधित मुद्दे