2011-06-01 8 views
6

के तत्वों के रूप में दो मैट्रिक्स के कॉलम लेने के साथ समारोह लागू करने पर विचार करें मैट्रिक्स d और rdim(d) = J x D और dim(r) = J x R साथ। मज़ेदार (ए, बी) एक ऐसा फ़ंक्शन बनें जो एक ही लंबाई के दो वैक्टर लेता है और कुछ संख्या देता है।
मैं ब्याज की इकाइयों के रूप में क्रमशः d और r के कॉलम का इलाज करना चाहता हूं और outer लागू करना चाहता हूं।बाहरी ब्याज

निम्नलिखित कोड d और r के स्तंभों की सूची बनाने और फिर दोनों outer और sapply का उपयोग कर करके पूरा करता है:

d.cols <- split(d, col(d)) 
r.cols <- split(r, col(r)) 
outer(d.cols, r.cols, 
     function(x,y) { 
      sapply(seq_along(x), 
       function(i) { 
        Fun(x[[i]], y[[i]]) })}) 

कोड जो मैं चाहता करता है और अपेक्षाकृत कुशल है, लेकिन अनाड़ी और यह स्पष्ट नहीं है । क्या मैं इसे पूरा करने की कोशिश कर रहा हूं, इसे पूरा करने का एक बेहतर तरीका है?

+0

यदि आप नमूना इनपुट/आउटपुट प्रदान की यह मदद मिलेगी। एक अच्छा नमूना समारोह 'Sum <- function (a, b) a + b' जैसा कुछ आसान होगा। –

+0

यहां एक और संबंधित प्रश्न: http://stackoverflow.com/questions/5233308/is-there-ar-function-that-applies-a-function-to-each-pair-of-columns/5233713#5233713 – Aaron

उत्तर

10

आप बहुत करीब हैं।

VecFun <- Vectorize(Fun) 

तो आप बस कर सकते हैं::

outer(d.cols, r.cols, VecFun) 

जैसे this related question में वर्णित है, आप सभी की जरूरत Vectorize() समारोह एक vectorized संस्करण में अपने Fun() समारोह कन्वर्ट करने के लिए है अगर आप को परिभाषित इस प्रकार

Fun <- function(a,b) sum(a+b) 

और r,d मैट्रिक्स परिभाषित कर रहे हैं:

J <- 5 
D <- 3 
R <- 4 

d <- matrix(1:(J*D), J, D) 
r <- matrix(1:(J*R), J, R) 

तो आप इस मिल:

> outer(d.cols, r.cols, VecFun) 

    1 2 3 4 
1 30 55 80 105 
2 55 80 105 130 
3 80 105 130 155 
+0

रखें 'वेक्टरिज़' उदाहरण आ रहे हैं! –

+0

@ रोमन मैंने यहां पर वेक्टरिज़ के बारे में सीखा है! –

+0

धन्यवाद, लिंक भी उपयोगी था। – kalu

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