आर

2016-01-25 3 views
5

में सूची तत्वों के सभी जोड़ी संयोजनों के लिए एक फ़ंक्शन लागू करें मैं सूची तत्वों के सभी जोड़ी संयोजनों में एक फ़ंक्शन लागू करना चाहता हूं। प्रत्येक तत्व एक ही लंबाई के साथ एक वेक्टर है। मैं n x n मैट्रिक्स प्रारूप में आउटपुट चाहता हूं, n मेरी सूची में तत्वों की संख्या होने के नाते।आर

निम्न उदाहरण पर विचार करें:

# Generating data 
l <- list() 
for(i in 1:5) l[[i]] <- sample(0:9, 5, T) 

# Function to apply 
foo <- function(x, y) 1 - sum(x * y)/sqrt(sum(x^2) * sum(y^2)) 

# Generating combinations 
comb <- expand.grid(x = 1:5, y = 1:5) 

इस पाश काम करता है, लेकिन यह धीमी है और उत्पादन एक मैट्रिक्स

# Applying function 
out <- list() 
for(i in 1:nrow(comb)) { 
    out[[i]] <- foo(l[[comb[i, 'x']]], l[[comb[i, 'y']]]) 
} 

किसी भी विचार के रूप में स्वरूपित नहीं है?

sapply(l, function(x) sapply(l, function(y) foo(x,y))) 

मैं @A में रुचि थी:

+2

'बाहरी (एल, एल, वेक्टरिज़ (foo))' –

+0

वाह! आपके उत्तर के लिए धन्यवाद, यह बहुत तेज है;) – goclem

उत्तर

5

एक नेस्टेड sapply चाल करना होगा। वेबब का समाधान

R> for(i in 1:50) l[[i]] <- sample(0:9, 5, T) 
R> microbenchmark(sapply(l, function(x) sapply(l, function(y) foo(x,y))), outer(l,l,Vectorize(foo)), time=1000) 
Unit: nanoseconds 
                expr  min  lq 
sapply(l, function(x) sapply(l, function(y) foo(x, y))) 7493739 8479127.0 
          outer(l, l, Vectorize(foo)) 6778098 8316362.5 
                time  5  48.5 
     mean median  uq  max neval 
1.042e+07 1.027e+07 1.155e+07 17982289 100 
1.030e+07 1.002e+07 1.187e+07 16076063 100 
1.672e+02 1.385e+02 1.875e+02  914 100 

R> for(i in 1:500) l[[i]] <- sample(0:9, 5, T) 
R> microbenchmark(sapply(l, function(x) sapply(l, function(y) foo(x,y))), outer(l,l,Vectorize(foo)), times=100) 
Unit: milliseconds 
                expr min lq mean 
sapply(l, function(x) sapply(l, function(y) foo(x, y))) 677.3 768.5 820.4 
          outer(l, l, Vectorize(foo)) 828.6 903.0 958.3 
median uq max neval 
    815.9 842.7 1278 100 
    930.7 960.5 1819 100 
छोटे सूचियों के लिए

तो बाहरी समाधान एक छोटे से तेजी से होता है, लेकिन बड़े सूचियों के लिए ऐसा लगता है कि नेस्टेड sapply समाधान थोड़ा तेजी से हो सकता है: यहाँ कुछ बेंच मार्किंग है।