比较两个基于容差阈值(±)为0.5

时间:2018-03-12 14:09:17

标签: r unique threshold intersect set-difference

我有两个向量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)

例如,在上面的两个向量中,来自0.5的{​​{1}}和来自g的{​​{1}}匹配,因为它们位于0.7附近彼此。 h±0.5也匹配。此外,9.49.3也匹配,因为它们的差异也在22.666范围内。

请务必注意22.333每个元素应与(-0.5, +0.5)每个元素进行比较。

是否有在g中执行此操作的功能?

遗憾的是,

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

3 个答案:

答案 0 :(得分:4)

您可以使用outer全部减去并将这些差异(它们的绝对值)调整为小于或等于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

答案 1 :(得分:1)

lapply(g, function(x) abs(x - h) < 1.0)

这会返回一个向量列表,根据g的容差,将h的每个元素与1.0的每个元素进行比较。

答案 2 :(得分:0)

试试这段代码:

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
相关问题