我有两个向量:
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语句来解决该问题。但是我想知道这是否是一个已知问题,并且我知道这样的术语,还是有人会想到一个优雅的解决方案
答案 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