从具有增加的整数和最终不同长度的两个向量(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的两个向量导致最小的差异。
答案 0 :(得分:2)
这是通过蛮力工作。 combn.a
和combn.b
的列是a
和b
中5个元素的组合。两列数据帧g
的每一行分别是combn.a
和combn.b
的一对列号。 f
评估与a
的行b
对应的r
和g
子集的绝对差值之和。 v
是找到的距离值,每行g
一个,ix
是g
中距离最短的行号。从g[ix,]
开始,我们可以在comb.a
和combn.b
中找到最小化列的列号,并从中确定相应的a
和b
子集。
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