我有一个有序的向量,例如:
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
。
有没有简单的方法呢?
答案 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 %>%
运算符分割的部分来拆分它。请注意较大的向量,因为dist
为O(N^2)
。