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

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

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.

这有什么简单的方法吗?

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

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%>%运算符分割的部分来拆分它.注意较大的向量,因为dist是O(N ^ 2).

点赞