给定两个列表的列表,我试图在不使用for循环的情况下获得第一个列表中所有元素方式产品的列表.例如:
> a <- list(c(1,2), c(2,3), c(4,5))
> b <- list(c(1,3), c(3,4), c(6,2))
> c <- list(a, b)
Run Code Online (Sandbox Code Playgroud)
该函数应返回一个包含9个条目的列表,每个条目大小为2.例如,
> answer
[[1]]
[1] 1 6
[[2]]
[1] 3 8
[[3]]
[1] 6 4
[[4]]
[1] 2 9
[[5]]
[1] 6 12
etc...
Run Code Online (Sandbox Code Playgroud)
我们欢迎所有的建议!
Jor*_*eys 10
快速(但内存密集)的方式是将mapply的机制与参数回收结合使用,如下所示:
mapply(`*`,a,rep(b,each=length(a)))
Run Code Online (Sandbox Code Playgroud)
给:
> mapply(`*`,a,rep(b,each=length(a)))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 2 4 3 6 12 6 12 24
[2,] 6 9 15 8 12 20 4 6 10
Run Code Online (Sandbox Code Playgroud)
或更换a同c[[1]]和b与c[[2]]获得相同.要获取列表,请设置参数SIMPLIFY = FALSE.
不知道这是快速还是内存密集,只是它有效,Joris Meys的答案更有说服力:
x <- expand.grid(1:length(a), 1:length(b))
x <- x[order(x$Var1), ] #gives the order you asked for
FUN <- function(i) diag(outer(a[[x[i, 1]]], b[[x[i, 2]]], "*"))
sapply(1:nrow(x), FUN) #I like this out put
lapply(1:nrow(x), FUN) #This one matches what you asked for
Run Code Online (Sandbox Code Playgroud)
编辑:现在布莱恩引入基准测试(我喜欢(LINK))我必须回应.我实际上使用我称之为expand.grid2的更快的答案,这是我从这里偷走的原件的重量较轻的版本.我之前要把它扔掉,但当我看到Joris的速度有多快时,我想到了为什么这么麻烦,既短又甜但又快.但是现在Diggs已经挖了我想我会把它扔到这里expand.grid2用于教育目的.
expand.grid2 <-function(seq1,seq2) {
cbind(Var1 = rep.int(seq1, length(seq2)),
Var2 = rep.int(seq2, rep.int(length(seq1),length(seq2))))
}
x <- expand.grid2(1:length(a), 1:length(b))
x <- x[order(x[,'Var1']), ] #gives the order you asked for
FUN <- function(i) diag(outer(a[[x[i, 1]]], b[[x[i, 2]]], "*"))
lapply(1:nrow(x), FUN)
Run Code Online (Sandbox Code Playgroud)
这是结果(除了TylerEG2使用的与Bryan相同的标签expand.grid2):
Unit: microseconds
expr min lq median uq max
1 DiggsL(a, b) 5102.296 5307.816 5471.578 5887.516 70965.58
2 DiggsM(a, b) 384.912 428.769 443.466 461.428 36213.89
3 Joris(a, b) 91.446 105.210 123.172 130.171 16833.47
4 TylerEG2(a, b) 392.377 425.503 438.100 453.263 32208.94
5 TylerL(a, b) 1752.398 1808.852 1847.577 1975.880 49214.10
6 TylerM(a, b) 1827.515 1888.867 1925.959 2090.421 75766.01
7 Wojciech(a, b) 1719.740 1771.760 1807.686 1924.325 81666.12
Run Code Online (Sandbox Code Playgroud)
如果我采取排序步骤,我可以发出更多的声音,但它仍然不接近Joris的答案.
