根据 0.5 的容差阈值 (±) 比较两个数字向量

ben*_*ett 1 r unique set-difference intersect threshold

我有两个向量g和h。我想比较这两个向量中的数字,看看它们之间是否有共同元素。但共同元素不必完全相同,可以在 的范围内(-0.5, +0.5)。因此,g\xc2\xb10.5正在与 进行比较h\xc2\xb10.5。

\n\n
g <- c(0.5, 5956.3, 38, 22.666, 590.3, 21.992, 9.3)\nh <- c(0.7, 99.2, 39, 30, 21.68, 9.4, 22.333, 0.001, 0.000222, 9.999)\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如,在上面的两个向量中,0.5fromg和0.7from匹配,因为它们彼此h位于 from 附近。并且还匹配。而且,并且也匹配,因为它们的差异也在范围之内。\xc2\xb10.59.49.322.66622.333(-0.5, +0.5)

\n\n

值得注意的是,的每个元素都应该与 的每个元素进行g比较。h

\n\n

有没有一个函数可以做到这一点R?

\n\n

all.equal不幸的是,函数仅将一个向量中的每个元素与另一个向量中具有相同索引的元素进行比较,因此期望向量的长度相等。我想做的是,我想将向量的每个元素g与向量的每个元素进行比较h。

\n

Sot*_*tos 5

您可以使用outer全部相减并将这些差异(它们的绝对值)限制为小于或等于 0.5,即

m1 <- which(abs(outer(g, h, `-`)) <= 0.5, arr.ind = TRUE)
Run Code Online (Sandbox Code Playgroud)

这使,

     row col   #where row = g and col = h
[1,]   1   1
[2,]   6   5
[3,]   7   6
[4,]   4   7
[5,]   6   7
[6,]   1   8
[7,]   1   9
Run Code Online (Sandbox Code Playgroud)

您可以尝试获得所需的输出(您没有指定您想要的输出方式)。这是一种方法,

cbind(g = g[m1[,1]], h = h[m1[,2]])

#            g        h
#    [1,]  0.500  0.700000
#    [2,] 21.992 21.680000
#    [3,]  9.300  9.400000
#    [4,] 22.666 22.333000
#    [5,] 21.992 22.333000
#    [6,]  0.500  0.001000
#    [7,]  0.500  0.000222
Run Code Online (Sandbox Code Playgroud)