我有一个类似下面的矢量:
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个值)
答案 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]
)