2013-06-28 10 views
13

मेरे पास आर में कारकों का एक मैट्रिक्स है और इसे प्रत्येक कारकों के सभी संभावित स्तरों के लिए डमी चर के 0 मैट्रिक्स में परिवर्तित करना चाहते हैं।आर: स्पैर मैट्रिक्स रूपांतरण

हालांकि यह "डमी" मैट्रिक्स बहुत बड़ा है (916 9 0x165 9 3) और बहुत स्पैस। मुझे इसे एक स्पैर मैट्रिक्स में स्टोर करने की ज़रूरत है, अन्यथा यह मेरे 12 जीबी रैम में फिट नहीं है।

वर्तमान में, मैं निम्नलिखित कोड का उपयोग कर रहा है और यह बहुत अच्छा काम करता है और सेकंड लेता है:

library(Matrix) 
X_factors <- data.frame(lapply(my_matrix, as.factor)) 
#encode factor data in a sparse matrix 
X <- sparse.model.matrix(~.-1, data = X_factors) 

हालांकि, मैं आर में e1071 पैकेज का उपयोग, और अंततः write.matrix.csr() साथ प्रारूप libsvm को यह मैट्रिक्स सहेजना चाहते , तो सबसे पहले मुझे अपने स्पैर मैट्रिक्स को स्पैर्सएम प्रारूप में परिवर्तित करने की आवश्यकता है।

मैं करने की कोशिश की:

library(SparseM) 
X2 <- as.matrix.csr(X) 

लेकिन यह बहुत जल्दी मेरी राम भरता है और अंत में दुर्घटनाओं आर। मुझे संदेह है कि आंतरिक रूप से, as.matrix.csr पहले स्पैस मैट्रिक्स को घने मैट्रिक्स में परिवर्तित करता है जो मेरे कंप्यूटर मेमोरी में फिट नहीं होता है।

मेरा दूसरा विकल्प स्पैरसेएम प्रारूप में सीधे मेरे स्पैर मैट्रिक्स को बनाना होगा।
मैंने as.matrix.csr(X_factors) की कोशिश की लेकिन यह कारकों के डेटा-फ्रेम को स्वीकार नहीं करता है।

क्या स्पैरसेम पैकेज में sparse.model.matrix(~.-1, data = X_factors) के बराबर है? मैंने प्रलेखन में खोज की लेकिन मुझे नहीं मिला।

उत्तर

18

काफी मुश्किल है लेकिन मुझे लगता है कि मुझे यह मिला। ,

i <- c(1,3:8) 
j <- c(2,9,6:10) 
x <- 7 * (1:7) 
X <- sparseMatrix(i, j, x = x) 

Matrix पैकेज एक कॉलम-ओरिएंटेड संपीड़न प्रारूप का उपयोग करता है SparseM दोनों स्तंभ और पंक्ति उन्मुख स्वरूपों का समर्थन करता है और कार्यों कि आसानी से संभाल कर सकते हैं, जबकि:

के Matrix पैकेज से एक विरल मैट्रिक्स के साथ शुरू करते हैं एक प्रारूप से दूसरे प्रारूप में रूपांतरण।

तो हम पहले कनवर्ट होने की हमारे कॉलम-ओरिएंटेड Matrix एक कॉलम-ओरिएंटेड SparseM मैट्रिक्स में: हम सिर्फ (0 या 1 पर शुरू) सही निर्माता बुला और देख कि दोनों संकुल सूचकांक के लिए अलग परंपराओं का उपयोग सावधान रहने की जरूरत है:

X.csc <- new("matrix.csc", ra = [email protected], 
          ja = [email protected] + 1L, 
          ia = [email protected] + 1L, 
          dimension = [email protected]) 

फिर, कॉलम-ओरिएंटेड लिए पंक्ति-उन्मुख प्रारूप से परिवर्तन:

X.csr <- as.matrix.csr(X.csc) 

और आप काम हो गया! आप जांच सकते हैं कि दो मैट्रिस समान हैं (मेरे छोटे उदाहरण पर):

range(as.matrix(X) - as.matrix(X.csc)) 
# [1] 0 0 
+0

यह पूरी तरह से काम करता है। त्वरित जवाब के लिए धन्यवाद। –

संबंधित मुद्दे