选择向量中的值并使其平均值彼此过于接近

时间:2017-05-10 08:06:57

标签: r rounding

我有一个有序的向量,例如:

c(2, 2.8, 2.9, 3.3, 3.5, 4.7, 5.5, 7.2, 7.3, 8.7, 8.7, 10)

我希望不仅可以删除重复项(对于unique()很容易),还可以根据紧密度阈值删除彼此过于接近的平均值。

因此,对于上面的示例,如果两个值之间的差异是,例如< = 0.4,则将它们平均。矢量应该成为:

c(2, 2.85, 3.4, 4.7, 5.5, 7.25, 8.7, 10)

检查应该由数字对执行,直到没有更多的平均值为止。

编辑:注意2.9和3.3不应该被平均的事实,因为2.9已经被2.8平均,一旦完成,它与3.3的距离高于0.4。因此,群集2.8, 2.9, 3.3, 3.5最终为2.85, 3.4而不是3.125

有没有简单的方法呢?

1 个答案:

答案 0 :(得分:2)

您要做的基本上是对输入向量进行聚类(使用阈值),然后计算每个群集的摘要统计量。像这样:

library(tidyverse)

data.frame(
  nums = c(2, 2.8, 2.9, 3.3, 3.5, 4.7, 5.5, 7.2, 7.3, 8.7, 8.7, 10)) %>%
  mutate(group = nums %>% dist %>% hclust %>% cutree(h=.4)) %>%
  group_by(group) %>%
  summarise(result = mean(nums)) %>%
  .$result

您可以通过从后面移除由magrittr %>%运算符分割的部分来拆分它。请注意较大的向量,因为distO(N^2)