【问题标题】:Find closest, following numbers in two vectors在两个向量中查找最接近的以下数字
【发布时间】:2018-12-23 20:03:25
【问题描述】:

R 似乎还没有解决这个问题。所以,给定例如

a <- c(20, 104, 380, 388)
b <- c(16, 38, 108, 130, 200, 222, 291, 314, 384, 406, 476, 498, 568, 591)

如何在b 中找到在a 之后的那些数字?因此,这里的解决方案应该是[38 108 384 406]

请注意,ab 的长度可能不同。

【问题讨论】:

    标签: r sorting vector


    【解决方案1】:

    这利用了findInterval 函数:

    b[findInterval(a, b)+1]
    #### [1]  38 108 384 406
    

    这(可能还有这里建议的其他一些解决方案)需要您之前对 b 向量进行排序。

    您可以使用参数left.open 来决定当数字相等时您想要什么行为。

    【讨论】:

    • 这是给出示例的最快解决方案。
    • 一般来说是这样的。
    【解决方案2】:
     b[colSums(sapply(a,">",b))+1]
    [1]  38 108 384 406
    

    你也可以想到:

    b[as.numeric(cut(a,b))+1]
    [1]  38 108 384 406
    

    【讨论】:

    • 虽然这可行,但必须强调的是,从算法的角度来看,它的效率非常低,因为它涉及到b 的每个元素与a 的每个元素之间的比较。跨度>
    【解决方案3】:

    通过for循环:

    for (i in 1:length(a)){
      c[i]<-b[which (b>=a[i])[1]]
    }
    > c
    [1]  38 108 384 406
    

    【讨论】:

      【解决方案4】:
      sapply(a, function(x) min(b[b > x]))
      [1]  38 108 384 406
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        相关资源
        最近更新 更多