gpt4 book ai didi

r - 在一个向量中查找另一个向量中的值之间的值

转载 作者:行者123 更新时间:2023-12-04 11:22:15 25 4
gpt4 key购买 nike

我需要一些帮助来查找向量中位于关键值之间的值,不包括在内。

例如,使用以下向量 xy

x <- c(2, 6, 10)
y <- c(7, 1, 9, 12, 4, 6, 3)

我想找到 y 中的所有值介于 x 之间但不等于 x ,所以结果是
list(y[y > 2 & y < 6], y[y > 6 & y < 10])
# [[1]]
# [1] 4 3
#
# [[2]]
# [1] 7 9

所以在上面的结果中,
  • 3 和 4 介于 2 和 6 之间
  • 7 和 9 介于 6 和 10 之间
  • 12 不在任何东西之间,所以它被排除在外
  • 6 等于 6,所以也排除在外

  • 我已经在这方面工作了一段时间,但我很困惑。我会向您展示代码,但它只是很丑陋。

    如何快速找到一个向量中的值,另一个向量中的值之间的值是什么?

    最佳答案

    也许这对你有用:

    lapply(split(y[y > min(x) & y < max(x)], 
    findInterval(y[y > min(x) & y < max(x)], x)),
    function(z) z[!z %in% x])
    # $`1`
    # [1] 4 3
    #
    # $`2`
    # [1] 7 9

    当然,最好在拆分之前保持 DRY 和子集“y”,例如,使用 between (或 %between% )来自“data.table”:
    library(data.table)
    Z <- y[y %between% range(x) & !y %in% x]
    split(Z, findInterval(Z, x))
    # $`1`
    # [1] 4 3
    #
    # $`2`
    # [1] 7 9

    更新

    作为引用,到目前为止,所有三个选项都非常快:
    set.seed(1)
    x <- sort(sample(100000, 20, FALSE))
    y <- sample(100000, 100000, TRUE)

    AM <- function(x, y) {
    Z <- y[y %between% range(x) & !y %in% x]
    split(Z, findInterval(Z, x))
    }

    DA <- function(x, y) {
    indx <- Map(function(x, z) x + seq_len(z), x[-length(x)], diff(x) - 1)
    lapply(indx, function(x) y[y %in% x])
    }

    user <- function(x, y) {
    m <- t(diff(sign(outer(x, y, "-"))) == 2)
    split((m*y)[m], col(m)[m])
    }

    library(microbenchmark)
    microbenchmark(AM(x, y), DA(x, y), user(x, y))
    # Unit: milliseconds
    # expr min lq mean median uq max neval
    # AM(x, y) 22.58939 23.24731 26.29092 23.79639 25.64548 140.5610 100
    # DA(x, y) 149.46997 157.48534 162.47526 160.01823 164.74851 287.0808 100
    # user(x, y) 327.38835 437.44064 445.71955 446.65938 467.97784 637.3121 100

    关于r - 在一个向量中查找另一个向量中的值之间的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773622/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com