R中的非常特定的载体化

时间:2014-12-28 13:25:16

标签: r

更新:这不够精确。我实际拥有的是4个向量,表示2组点的x和y坐标以及一个函数,它给出了一对数作为每对点的输出(即每个点的一个点)。我想在不使用for循环的情况下编写这个计算。

例如

     x1=c(0,1,2,3)
     y1=c(4,5,6,7)
     x2=c(1,3,5,7)
     y2=c(2,4,6,8)
     f=(x1+y1+x2)/y2

3 个答案:

答案 0 :(得分:1)

可能有帮助

f1 <- function(i,j) (x1[i]+y1[i]+x2[j])/y2[j]
outer(seq_along(x1), seq_along(x2), f1)
#    [,1] [,2]     [,3]  [,4]
#[1,]  2.5 1.75 1.500000 1.375
#[2,]  3.5 2.25 1.833333 1.625
#[3,]  4.5 2.75 2.166667 1.875
#[4,]  5.5 3.25 2.500000 2.125

基准

 set.seed(21)
 x1 <- sample(1:20,1e3,replace=TRUE)
 x2 <-  sample(1:30, 1e3, replace=TRUE)
 y1 <- sample(1:20,1e3, replace=TRUE)
 y2 <- sample(1:40,1e3,replace=TRUE)

 akrun <- function() {f1 <- function(i,j) (x1[i]+y1[i]+x2[j])/y2[j]
            outer(seq_along(x1), seq_along(x2), f1)}

 library(proxy)
 JH <- function(){f <- function(a,b) (a[1]+a[2]+b[1])/b[2]
                dist(cbind(x1,y1),cbind(x2,y2),method=f)}

 library(microbenchmark)
 microbenchmark(akrun(), JH(), unit='relative', times=20L)
 # Unit: relative
 # expr      min       lq     mean   median       uq      max neval cld
 #akrun()  1.00000  1.00000  1.00000  1.00000  1.00000  1.00000    20  a 
 #   JH() 60.40066 58.46018 58.08219 58.49396 57.10239 55.18854    20  b

答案 1 :(得分:1)

你要求的是一个&#34;距离矩阵&#34;基于用户定义的距离函数。您可以使用dist(...)包中的proxy轻松完成此操作。

f <- function(a,b) (a[1]+a[2]+b[1])/b[2]
library(proxy)
dist(cbind(x1,y1),cbind(x2,y2),method=f)
#      [,1]     [,2]     [,3]     [,4]    
# [1,] 2.500000 1.750000 1.500000 1.375000
# [2,] 3.500000 2.250000 1.833333 1.625000
# [3,] 4.500000 2.750000 2.166667 1.875000
# [4,] 5.500000 3.250000 2.500000 2.125000

答案 2 :(得分:0)

  

mapply(FUN =函数(x1,y1,x2,y2)(x1 + y1 + x2)/ y2,x1 = c(0,1,2,3),   y1 = c(4,5,6,7),x2 = c(1,3,5,7),y2 = c(2,4,6,8))

[1] 2.500000 2.250000 2.166667 2.125000