基于接近度的两个向量的匹配元素

时间:2018-12-02 18:07:33

标签: r

我有两个向量:

a<-c(268, 1295, 1788, 2019, 2422)
b<-c(266,  952, 1295, 1791, 2018)

我想根据最小的差异将b的元素与a的元素进行匹配。因此a [1]将与b [1]匹配。 但是,每个元素只能与单个其他元素匹配。元素可能无法匹配。如果b中的两个元素与a中的相同元素具有最小的差异,则匹配差异较小的元素。

例如952和1295最接近元素a [2],因为1295更接近(在这种情况下甚至等于)a [2],它将与1295匹配。 此特定示例的最终解决方案应如下所示。

268  NA  1295 1788 2019 2422
266 952  1295 1791 2018 NA

某些项目不匹配,尽管可以匹配952和2422,但我需要的代码不会将它们视为匹配项,因为在它们之间找到了匹配项。向量也在严格增加。

凭借我的编码能力,我将使用大量的if语句来解决该问题。但是我想知道这是否是一个已知问题,并且我知道这样的术语,还是有人会想到一个优雅的解决方案

1 个答案:

答案 0 :(得分:2)

一种基本的R方法,尽管可能不是最优雅的方法:

aux1 <- apply(abs(outer(a, b, `-`)), 2, function(r) c(min(r), which.min(r)))
colnames(aux1) <- 1:length(b)
aux2 <- tapply(aux1[1, ], factor(aux1[2, ], levels = 1:length(a)),
               function(x) as.numeric(names(which.min(x))))
rbind(cbind(a, b = b[aux2]), cbind(a = NA, b = b[-aux2[!is.na(aux2)]]))
#         a    b
# [1,]  268  266
# [2,] 1295 1295
# [3,] 1788 1791
# [4,] 2019 2018
# [5,] 2422   NA
# [6,]   NA  952

此处aux1包含距离a(第二行)和相应距离(第一行)最近的b个元素。

tmp
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    2  343    0    3    1
# [2,]    1    2    2    3    4

那么aux2可能已经满足您的目的。

out
#  1  2  3  4  5 
#  1  3  4  5 NA 

aux1显示了一些联系,但aux2现在给出了a(第二行)的哪个元素应分配给b(名称)的哪个元素。然后在最后一行中,绑定其余元素。


在更复杂的情况下,我们有

a <- c(932, 1196, 1503, 2819, 3317, 3845, 4118, 4544)
b <- c(1190, 1498, 2037, 2826, 3323, 4128, 4618, 1190, 1498, 2037, 2826, 3323, 4128, 4618)

# ....

rbind(cbind(a, b = b[aux2]), cbind(a = NA, b = b[-aux2[!is.na(aux2)]]))    
#          a    b
#  [1,]  932   NA
#  [2,] 1196 1190
#  [3,] 1503 1498
#  [4,] 2819 2826
#  [5,] 3317 3323
#  [6,] 3845   NA
#  [7,] 4118 4128
#  [8,] 4544 4618
#  [9,]   NA 2037
# [10,]   NA 1190
# [11,]   NA 1498
# [12,]   NA 2037
# [13,]   NA 2826
# [14,]   NA 3323
# [15,]   NA 4128
# [16,]   NA 4618