[英]Apply a function to all pairwise combinations of list elements in R
我想將一個函數應用於列表元素的所有成對組合。 每個元素都是具有相同長度的向量。 我希望輸出采用nxn
矩陣格式, 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可以解決這個問題:
sapply(l, function(x) sapply(l, function(y) foo(x,y)))
我對@A很感興趣。 韋伯的解決方案。 以下是一些基准測試:
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解決方案似乎可能會更快一些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.