【发布时间】:2017-05-10 08:06:57
【问题描述】:
我有一个有序向量,比如:
c(2, 2.8, 2.9, 3.3, 3.5, 4.7, 5.5, 7.2, 7.3, 8.7, 8.7, 10)
我不仅想删除重复项(使用unique() 很容易),还想根据接近度阈值对彼此太接近的值进行平均。
因此,对于上面的示例,如果两个值之间的差异为
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。
有什么简单的方法吗?
【问题讨论】:
-
cumsum(...diff(...成语可用于创建分组变量。这可能是典型的问答:How to partition a vector into groups of regular, consecutive sequences?。只需在连续数字之间设置您想要的difference。 -
@Henrik 你的意思是像
split(v,cumsum(c(1,diff(v)>=0.4))),或者像使用plyr::round_any()。编辑:我现在看到 mt1022 的答案。 -
你不需要
split。只要有分组变量,就有很多方法(base、data.table、dplyr)来汇总分组数据。 -
对不起,我想我误解了你的问题。仔细阅读(包括您的编辑),这似乎需要递归解决。干杯。
-
@Henrik liborm 的方法似乎对我有用