2011-06-07 12 views
5

के बिना मैट्रिक्स के सभी पंक्ति-जोड़े में फ़ंक्शन को लागू करना मै मैट्रिक्स में सभी पंक्तियों के लिए सभी जोड़ी तुलना चाहता हूं, स्पष्ट रूप से लूप के लिए डबल काम करेगा लेकिन बड़े डेटासेट के लिए बेहद महंगा होगा।आर: लूप

मैंने apply() इत्यादि जैसे अंतर्निहित पाश को देखा, लेकिन आंतरिक लूप से बचने के लिए कोई संकेत नहीं है।

इसे कैसे प्राप्त किया जा सकता है?

उत्तर

6

मुझे लगता है कि आप मैट्रिक्स के सभी पंक्ति-जोड़े में कुछ प्रकार की तुलना करने की कोशिश कर रहे हैं। आप पंक्ति-सूचकांक के सभी जोड़े के माध्यम से चलाने के लिए outer() का उपयोग कर सकते हैं, और प्रत्येक पंक्ति-जोड़ी में वेक्टरकृत तुलना फ़ंक्शन लागू कर सकते हैं। जैसे @Prasad के रूप में इतना सार्वभौमिक समाधान

m <- matrix(1:12,4,3)  
> outer(1:4,1:4, FUN = Vectorize(function(i,j) sum((m[i,]-m[j,])^2))) 
    [,1] [,2] [,3] [,4] 
[1,] 0 3 12 27 
[2,] 3 0 3 12 
[3,] 12 3 0 3 
[4,] 27 12 3 0 
+0

परिणाम का प्रिंट नहीं करना चाहता हूं! धन्यवाद। केवल एक चीज जिसे मैंने समझा नहीं है वह उदाहरण है कि बाहरी कार्य में उदाहरण 1: 4, 1: 4 है? क्या वे आउटपुट के आयाम हैं लेकिन मैंने सोचा कि उन्हें मज़ा के लिए तर्क होना चाहिए? – rpylearning

+0

4 मूल मैट्रिक्स में पंक्तियों की संख्या है। – Aaron

+0

मेरे पास परिणाम मैट्रिक्स से डेटा का उपयोग करने के लिए निम्न प्रश्न है, यहां सहसंबंध मैट्रिक्स है, उदा। – rpylearning

0

शायद नहीं, लेकिन बहुत तेजी से वर्गों का योग के इस विशेष मामले में:

dist(m)^2 
5

outer() इस प्रकार आप सभी पंक्ति-जोड़े के बीच चुकता इयूक्लिडियन दूरी की गणना कर सकते अगर आप स्वयं की तुलना करने के इच्छुक हैं - जैसे कि 1-1 और 2-2 आदि ... (मैट्रिक्स में विकर्ण मूल्य)। बाहरी() दोनों 1-2 और 2-1 तुलना करता है।

अधिकांश बार जोड़ी-वार तुलनाओं को स्वयं-तुलना और दर्पण तुलना के बिना त्रिकोणीय तुलना की आवश्यकता होती है। त्रिकोणीय तुलना प्राप्त करने के लिए, combn() विधि का उपयोग करें।

यहां एक नमूना उत्पादन outer() और के बीच combn()

> v <- c(1,2,3,4) 
> outer(v, v, function(x, y) print(paste(x, "-", y))) 
[1] "1 - 1" "2 - 1" "3 - 1" "4 - 1" "1 - 2" "2 - 2" "3 - 2" "4 - 2" "1 - 3" "2 - 3" "3 - 3" "4 - 3" "1 - 4" "2 - 4" "3 - 4" "4 - 4" 

नोट के ऊपर "1-1" आत्म comparisions अंतर दिखाने के लिए है। और "1-2" और "2-1" दर्पण तुलना। नीचे के साथ कंट्रास्ट:

> v <- c(1,2,3,4) 
> allPairs <- combn(length(v), 2) # choose a pair from 1:length(v) 
> a_ply(combn(length(v), 2), 2, function(x) print(paste(x[1],"--",x[2]))) # iterate over all pairs 
[1] "1 -- 2" 
[1] "1 -- 3" 
[1] "1 -- 4" 
[1] "2 -- 3" 
[1] "2 -- 4" 
[1] "3 -- 4" 

आप उपरोक्त में मैट्रिक्स के "ऊपरी त्रिकोणीय" हिस्सा देख सकते हैं।

बाहरी() अधिक उपयुक्त है जब आपके पास जोड़ी-वार ऑपरेशन करने के लिए दो अलग-अलग वैक्टर होते हैं। एकल वेक्टर के भीतर जोड़ी-वार संचालन करने के लिए, अक्सर आप combn से दूर नहीं जा सकते हैं।

उदाहरण के लिए, यदि आप outer(x,x,...) कर रहे हैं तो आप शायद गलत कर रहे हैं - आप combn(length(x),2))

+0

मैंने समय श्रृंखला की सूची के लिए क्रॉस सहसंबंध मैट्रिक्स प्राप्त करने के लिए इस दृष्टिकोण को लागू करने का प्रयास किया जहां मैं सीसीएफ मैट्रिक्स की गणना करना चाहता हूं। सीसीएफ <- फ़ंक्शन (एक्स) { सीसीएफ (एक्स [1], एक्स [2], lag.max = 12, प्लॉट = गलत) }। जहां एक्स समय श्रृंखला की एक सूची है। क्या आप कृपया इसका सुझाव दें कि इसका उपयोग कैसे करें। adply (combn (tslist, 2), 2, फ़ंक्शन (x) ccff (x)) काम नहीं कर रहा है। धन्यवाद। – Anusha

+0

@Anusha कृपया अपना नमूना कोड साझा करें (जो एक्स को पॉप्युलेट करता है और सीसीएफ चलाता है) - इसे जांचेगा। आप http://gk.palem.in/Contact.html –

+0

पर अपने संपर्क फ़ॉर्म का उपयोग करके मुझे अपना स्निपेट आईएम कर सकते हैं कृपया यह प्रश्न देखें जिसमें मैं मैप्ली का उपयोग करने की कोशिश कर रहा था। मुझे यह जानकर उत्सुकता है कि श्रृंखला की जोड़ी के सेट पर कैल्क के लिए विज्ञापन का उपयोग कैसे किया जा सकता है। http://stackoverflow.com/questions/25477116/how-to-use-mapply-to-calculate-ccf-for-list-of-pairs-of-time-series। धन्यवाद। इस उद्देश्य के लिए – Anusha

0

@Gopalkrishna Palem

पर विचार करना चाहिए मैं अपने समाधान पसंद है! हालांकि, मुझे लगता है कि आपको combn (लंबाई, v), 2) के बजाय combn (v, 2) का उपयोग करना चाहिए। combn (लंबाई (v), 2) वी

> v <- c(3,4,6,7) 
> combn(v, 2) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 3 3 4 4 6 
[2,] 4 6 7 6 7 7 

> combn(length(v), 2) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 1 1 2 2 3 
[2,] 2 3 4 3 4 4 

> a_ply(combn(v, 2), 2, function(x) print(paste(x[1],"--",x[2]))) 
[1] "3 -- 4" 
[1] "3 -- 6" 
[1] "3 -- 7" 
[1] "4 -- 6" 
[1] "4 -- 7" 
[1] "6 -- 7" 
> a_ply(combn(length(v), 2), 2, function(x) print(paste(x[1],"--",x[2]))) 
[1] "1 -- 2" 
[1] "1 -- 3" 
[1] "1 -- 4" 
[1] "2 -- 3" 
[1] "2 -- 4" 
[1] "3 -- 4" 

की indecies से अधिक केवल दोहराता तो अंतिम परिणाम combn साथ सही है (V, 2)।

तो अगर हम एक dataframe है, हम सूचकांक जोड़ो में पंक्तियों को एक समारोह को लागू करने के लिए उपयोग कर सकते:

> df 
    x y 
1 4 8 
2 5 9 
3 6 10 
4 7 11 

a_ply(combn(nrow(df), 2), 2, function(x) print(df[x[1],] - df[x[2],])) 
    x y 
1 -1 -1 
    x y 
1 -2 -2 
    x y 
1 -3 -3 
    x y 
2 -1 -1 
    x y 
2 -2 -2 
    x y 
3 -1 -1 

हालांकि, a_ply परिणाम को छोड़ दिया जाएगा, तो मैं के लिए एक वेक्टर में उत्पादन कैसे स्टोर कर सकते हैं आगे के विश्लेषण?मैं सिर्फ

+0

आउटपुट को स्टोर करने के लिए, आप 'a_ply' के बजाय' एपली 'या' adply' आज़मा सकते हैं –