如何在R中的向量中找到值与其最接近值之间的差异?

时间:2016-01-26 14:40:28

标签: r statistics

我有一个类似下面的矢量:

x= c(1,23,4,15,8,17,21)

在向量中的排序值后,我们有:

c(1,4,8,15,17,21,23)

我要求的输出是:

c(3, 3, 4, 2, 2, 2, 2) 

其中包含值与其最接近值之间的差异。

但是如果我想要没有排序的输出,有什么解决方案吗?我需要像c(3,2,3,2,4,2,2)这样的输出来知道哪个样本在输出表中具有最大值(这里是第5个值)

5 个答案:

答案 0 :(得分:13)

d <- diff(sort(x))
pmin(c(d, NA), c(NA, d), na.rm = TRUE)
# [1] 3 3 4 2 2 2 2

答案 1 :(得分:7)

如果我理解正确,你想计算一个矢量成员和它的邻居之间的最小值。

首先,我们对数据进行排序。

x= sort(c(1,23,4,15,8,17,21))

然后,我们计算与左邻居(项目1缺失)的差异以及与右邻居的差异(项目2缺失)

diffs <- cbind(c(NA,diff(x)),c(diff(x),NA))

所以,现在我们对每个项目左右都有区别,现在剩下的就是找到最小的:

res <- apply(diffs,MARGIN=1, min, na.rm=T)

请注意,虽然此解决方案包含解释,但当性能出现问题时,其他提供的解决方案(尤其是@Julius的pmin方法)可能会更快。

答案 2 :(得分:7)

很好的解决方案。朱利叶斯似乎是最快的:

int main(void) {

答案 3 :(得分:5)

你可以尝试:

library(dplyr)
x <- sort(x)
pmin(abs(x-lag(x)),abs(x-lead(x)),na.rm=T)
#[1] 3 3 4 2 2 2 2

x-lag(x)使用最接近的较小数字计算差异,x-lead(x)计算与最接近的较大数字的差异。

答案 4 :(得分:1)

你可以通过蛮力来做到这一点:

x <- c(1, 4, 8, 15, 17, 21, 23)

n <- length(x)
ds <- c(
  x[2] - x[1], 
  sapply(
    2:(n - 1), 
    function(i) min(x[i] - x[i - 1], x[i + 1] - x[i])
  ),
  x[n] - x[n - 1]
)