我确定这是一个简单的问题。我有两个向量' d'并且' r'。我想计算d和r的所有组合的t =(d + r)/ d。因此,我想得到一个矩阵,其中使用r的每个值计算每个d的t。
输出应如下所示:https://www.dropbox.com/s/hf74s4jz2qe3st7/table.jpg?dl=0
我尝试了for
循环并查看了apply
,但到目前为止还未成功。
我希望有人可以提供帮助。
编辑:这是我试过的for
循环:
t<-matrix(nrow=length(d), ncol=length(r))
for(i in 1:length(r)){
t[i]=(d+r[i])d
}
没有工作:(
答案 0 :(得分:3)
这应该这样做。首先定义你的功能。
然后按照评论中的建议将其与outer
一起应用。很好听!
d <- 1:10
t <- 1:10
fun1 <- function(d,t){ (d + t ) / d }
outer(d, t, fun1)
答案 1 :(得分:0)
以下是三种解决方案:
d <- 1:5; r <- 11:15
outer(d,r, FUN=function(d,r) 1+r/d)
1 + matrix(r, 5, 5, byrow=TRUE)/matrix(d, 5, 5)
sapply(r, function(rr) 1 + rr/d)
以下是基准测试的结果(+其他解决方案):
library("microbenchmark")
d <- 1:5; r <- 11:15
microbenchmark(
o= outer(d,r, FUN=function(d,r) 1+r/d),
o2= outer(d,r, FUN=function(d,r) (d+r)/d),
m= 1 + matrix(r, 5, 5, byrow=TRUE)/matrix(d, 5, 5),
m2= 1 + matrix(r, 5, 5, byrow=TRUE)/d,
s= sapply(r, function(rr) 1 + rr/d),
a= apply(as.matrix(r, 1), 1, function(rr) 1 + rr/d),
t= 1 + tcrossprod(1/d, r))
# Unit: nanoseconds
# expr min lq mean median uq max neval cld
# o 4497 5320.5 6423.44 6105.5 6659.5 15676 100 c
# o2 4392 5233.5 6591.64 6076.0 6681.0 18743 100 c
# m 2865 3468.0 4082.88 3783.0 4160.5 13109 100 b
# m2 1698 2196.5 2461.73 2349.5 2645.0 7715 100 a
# s 15602 17748.0 20496.18 19029.0 20770.5 53250 100 d
# a 26887 28836.5 32818.68 30272.5 35822.5 63613 100 e
# t 990 1437.5 1796.66 1611.5 1770.5 10153 100 a