如何根据两个向量

时间:2017-03-28 11:14:01

标签: r

我确定这是一个简单的问题。我有两个向量' 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
      }

没有工作:(

2 个答案:

答案 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