【问题标题】:Find best match of two vectors with different length in R在R中找到具有不同长度的两个向量的最佳匹配
【发布时间】:2016-03-10 12:40:06
【问题描述】:

从两个具有递增整数和最终不同长度的向量 (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)

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

【问题讨论】:

    标签: r


    【解决方案1】:

    这是通过蛮力工作的。 combn.acombn.b 的列是来自 ab 的 5 个元素的组合。两列数据框g的每一行分别是一对列号combn.acombn.bf 计算与g 的行r 对应的ab 子集的绝对差之和。 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
    

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2012-01-26
      • 2016-10-11
      • 2021-10-29
      相关资源
      最近更新 更多