找到R

时间:2016-03-10 12:40:06

标签: r

从具有增加的整数和最终不同长度的两个向量(a,b),我想提取两个长度为n(= 5)的向量,当从b中减去a时,这两个向量导致最小的差异。

实施例

a<-c(25,  89, 159, 224, 292, 358)

b<-c(1, 19,  93, 155, 230, 291)

减去以下元素会产生最小的差异:

c(25-19, 89-93, 159-155, 225-230, 291-292)

从a,358被排除

从b中排除1。

问题: 矢量的长度可以变化:

实施例

a<-c(25,  89, 159, 224, 292, 358)

b<-c(19,  93, 155, 230, 291)


a<-c(25,  89, 159, 224, 292, 358, 560)

b<-c(19,  93, 155, 230, 291)


a<-c(25,  89, 159, 224, 292, 358)

b<-c(1 , 5, 19,  93, 155, 230, 291)

因为我必须为&gt; 1000个向量找到这个“最佳匹配”,我想构建一个函数,将两个不同长度的向量作为输入,并给出输出长度为n = 5的两个向量导致最小的差异。

1 个答案:

答案 0 :(得分:2)

这是通过蛮力工作。 combn.acombn.b的列是ab中5个元素的组合。两列数据帧g的每一行分别是combn.acombn.b的一对列号。 f评估与a的行b对应的rg子集的绝对差值之和。 v是找到的距离值,每行g一个,ixg中距离最短的行号。从g[ix,]开始,我们可以在comb.acombn.b中找到最小化列的列号,并从中确定相应的ab子集。

align5 <- function(a, b) {
   combn.a <- combn(a, 5)
   combn.b <- combn(b, 5)
   g <- expand.grid(a = 1:ncol(combn.a), b = 1:ncol(combn.b))
   f <- function(r) sum(abs(combn.a[, r[1]] - combn.b[, r[2]]))
   v <- apply(g, 1, f)
   ix <- which.min(v)
   rbind( combn.a[, g[ix, 1] ], combn.b[,g[ix, 2] ] )
}

# test

a <- c(25,  89, 159, 224, 292, 358)
b <- c(1, 19,  93, 155, 230, 291)
align5(a, b)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   25   89  159  224  292
## [2,]   19   93  155  230  291