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

Compare two vectors of numbers based on threshold of tolerance (±) of 0.5

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

g <- c(0.5, 5956.3, 38, 22.666, 590.3, 21.992, 9.3)
h <- c(0.7, 99.2, 39, 30, 21.68, 9.4, 22.333, 0.001, 0.000222, 9.999)

例如,在上面的两个向量中,g 中的 0.5h 中的 0.7 匹配,因为它们在 [=20= 附近] 从彼此。 9.49.3 也匹配。此外,22.66622.333 也匹配,因为它们的差异也在 (-0.5, +0.5).

范围内

重要的是要注意 g 的每个元素 应该与 h每个元素 进行比较].

R 中是否有执行此操作的函数?

不幸的是,

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

的每个元素进行比较
lapply(g, function(x) abs(x - h) < 1.0)

这个 returns 一个向量列表,根据您对 1.0 的容忍度,将 g 的每个元素与 h 的每个元素进行比较。

试试这个代码:

comb<-expand.grid(g, h)
colnames(comb)<-c("g","h")

comb[abs(comb[,1]-comb[,2])<1,]
        g         h
1   0.500  0.700000
32 22.666 21.680000
34 21.992 21.680000
42  9.300  9.400000
46 22.666 22.333000
48 21.992 22.333000
50  0.500  0.001000
57  0.500  0.000222
70  9.300  9.999000

你可以用outer all by all 减去所有差值(它们的绝对值)小于或等于0.5,即

m1 <- which(abs(outer(g, h, `-`)) <= 0.5, arr.ind = TRUE)

这给出了,

     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

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

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