[英]Apply a function to all pairwise combinations of list elements in R
I want to apply a function to all pairwise combinations of list elements. 我想将一个函数应用于列表元素的所有成对组合。 Each element is a vector with the same length.
每个元素都是具有相同长度的向量。 I would like the output in a
nxn
matrix format, n
being the number of elements in my list. 我希望输出采用
nxn
矩阵格式, n
是列表中的元素数量。
Consider the following example: 请考虑以下示例:
# 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)
This loop works but it is slow and the output is not formatted as a matrix 此循环有效,但速度很慢,输出未格式化为矩阵
# Applying function
out <- list()
for(i in 1:nrow(comb)) {
out[[i]] <- foo(l[[comb[i, 'x']]], l[[comb[i, 'y']]])
}
Any idea? 任何的想法?
A nested sapply would do the trick: 嵌套的sapply可以解决这个问题:
sapply(l, function(x) sapply(l, function(y) foo(x,y)))
I was interested in @A. 我对@A很感兴趣。 Webb's solution.
韦伯的解决方案。 Here is some benchmarking:
以下是一些基准测试:
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
So for smaller lists the outer solution is a little faster, but for larger lists it appears that the nested sapply solution may be a bit faster. 因此对于较小的列表,外部解决方案要快一些,但对于较大的列表,嵌套的sapply解决方案似乎可能会更快一些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.