我有一个有序的向量,例如:
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).