키 값 사이에있는 벡터 값을 찾는 데 도움이 필요합니다.
예를 들어, 다음 벡터 x
및y
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
따라서 위의 결과에서
나는 이것에 대해 잠시 동안 작업을 해왔고 나는 어리둥절합니다. 나는 당신에게 코드를 보여줄 것이지만 그것은 단지 추악한 것입니다.
한 벡터에서 다른 벡터의 값 사이에있는 값을 어떻게 빨리 찾을 수 있습니까?
아마도 이것이 당신을 위해 일할 것입니다.
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
물론, 예를 들어 "data.table"에서 between
(또는 %between%
)를 사용하여 분할하기 전에 DRY 및 하위 집합 "y"를 유지하는 것이 좋습니다 .
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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다