【问题标题】:Compare two vectors of numbers based on threshold of tolerance (±) of 0.5根据公差阈值 (±) 0.5 比较两个数字向量
【发布时间】:2018-08-20 14:17:38
【问题描述】:

我有两个向量 gh。我想比较这两个向量中的数字,看看它们之间是否有任何共同的元素。但共同元素不必完全相同,可以在(-0.5, +0.5) 的范围内。因此,g±0.5 正在与 h±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)

例如,在上面的两个向量中,来自g0.5 和来自h0.7 匹配,因为它们彼此位于±0.5 的附近。 9.49.3 也匹配。此外,22.66622.333 也匹配,因为它们的差异也在(-0.5, +0.5) 范围内。

请务必注意,g每个元素都应与h每个元素进行比较。

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

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

【问题讨论】:

    标签: r unique threshold intersect set-difference


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 这可能会失败,请尝试x &lt;- c(5.1, 3.5);y &lt;- c(5.11, 3);abs(outer(x, y, "-")) &lt;= .01
    【解决方案2】:

    试试这个代码:

    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
    

    【讨论】:

      【解决方案3】:
      lapply(g, function(x) abs(x - h) < 1.0)
      

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

      【讨论】:

      • sapply 返回一个矩阵,也许它更好,更紧凑。点赞。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多