【问题标题】:index from one vector to another by closest values按最接近的值从一个向量索引到另一个向量
【发布时间】:2019-07-24 08:20:20
【问题描述】:

给定两个已排序的向量,如何获得从一个到另一个的最接近值的索引。

例如,给定:

a = 1:20
b = seq(from=1, to=20, by=5)

我怎样才能有效地得到向量

c = (1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4)

对于a 中的每个值,它提供b 中小于或等于它的最大值的索引。但该解决方案需要适用于ab 的不可预测(尽管已排序)内容,并且在ab 很大时需要快速。

【问题讨论】:

标签: r search


【解决方案1】:

您可以使用findInterval,它构造由b 中的断点给出的区间序列,并返回a 的元素所在的区间索引(有关其他参数,另请参见?findInterval,例如区间边界处的行为)。

a = 1:20
b = seq(from = 1, to = 20, by = 5)

findInterval(a, b)
#>  [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

【讨论】:

  • 酷。这也可以适用于大于或等于的最接近的值吗?
  • findInterval(a, c(-Inf, b), left.open = TRUE)findInterval(a, b, left.open = TRUE) + 1 可能就足够了。这将为a 中大于max(b) 的值提供索引length(b) + 1
【解决方案2】:

我们可以使用cut

as.integer(cut(a, breaks = unique(c(b-1, Inf)), labels = seq_along(b)))

#[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

【讨论】:

  • 如果b中有重复则失败;返回一个因子而不是一个向量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2022-08-14
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多