gpt4 book ai didi

r - 同一向量中最接近的其他值

转载 作者:行者123 更新时间:2023-12-03 18:25:07 24 4
gpt4 key购买 nike

我有一个向量

set.seed(2)
x <- sample.int(20, 5)

[1] 4 14 11 3 16

现在,对于我想找到的每个元素

距离最小的元素 ( min(abs(x[i]-x[-i])) 对于元素 i ),这里是
[1]  3 16 14  4 14

(第一) 索引距离最小的元素,这里是
[1] 4 5 2 1 2

关键是不考虑元素本身,而只考虑所有其他元素,这就是为什么这个 R - Fastest way to find nearest value in vector
不是答案。

如果实际答案就在那里,抱歉 - 我没有找到。

最佳答案

1) Rfast 使用 dista在 Rfast 中,我们得到最接近的两个索引。取第二个最接近的,因为最接近的将是相同的值。

library(Rfast)
x <- c(4, 14, 11, 3, 16) # input

x[ dista(x, x, k = 2, index = TRUE)[, 2] ]
## [1] 3 16 14 4 14

2) sqldf 使用 SQL,我们可以将 DF 连接到自身,排除相同的值,并获取距离最小的行。
DF <- data.frame(x)   # x is from (1)
sqldf("select a.x, b.x nearest, min(abs(a.x - b.x))
from DF a
left join DF b on a.x != b.x
group by a.rowid")[1:2]

给予:
   x nearest
1 4 3
2 14 16
3 11 14
4 3 4
5 16 14

3) 动物园对输入进行排序,取每个元素两侧最小差异对应的值并将其排序。
library(zoo)
ix <- order(x)
least <- function(x) if (x[2] - x[1] < x[3] - x[2]) x[1] else x[3]
rollapply(c(-Inf, x[ix], Inf), 3, least)[order(ix)]
## [1] 3 16 14 4 14

4) 基础 R 使用 ixleast从(3)我们可以只使用基函数来模拟(3)如下。
apply(embed(c(-Inf, x[ix], Inf),  3)[, 3:1], 1, least)[order(ix)]
## [1] 3 16 14 4 14

4a) 这种稍短的变化也适用:
-apply(embed(-c(-Inf, x[ix], Inf),  3), 1, least)[order(ix)]
## [1] 3 16 14 4 14

4b) 进一步简化我们有以下基本解决方案,其中 ix来自(3):
xx <- x[ix]
x1 <- c(-Inf, xx[-length(xx)])
x2 <- c(xx[-1], Inf)
ifelse(xx - x1 < x2 - xx, x1, x2)[order(ix)]
## [1] 3 16 14 4 14

重复

问题中的示例没有重复,但如果有重复,则问题定义存在一些问题。例如,如果我们有 c(1, 3, 4, 1)然后,如果我们查看第一个值 1,则还有另一个值与它完全相等,因此最接近的值是 1。另一种解释是应该返回不等于 1 的最接近的值,在这种情况下是 3。在代码中上方 sqldf解给出不等于当前值的最接近值,而其他解给出剩余值中最接近的值。

如果我们想要对除 sqldf 以外的那些最接近的不相等的解释那么我们可以使用 rle订购后将其压缩为唯一值,然后使用 inverse.rle之后如修改后的4b所示:
x <- c(1, 3, 4, 1)
ix <- order(x)
r <- rle(x[ix])
xx <- r$values
x1 <- c(-Inf, xx[-length(xx)])
x2 <- c(xx[-1], Inf)
r$values <- ifelse(xx - x1 < x2 - xx, x1, x2)
inverse.rle(r)[order(ix)]
## [1] 3 4 3 3

关于r - 同一向量中最接近的其他值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60341501/

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