【问题标题】:Select and average values in a vector which are too close to each other选择向量中彼此太接近的值并取平均值
【发布时间】: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。只要有分组变量,就有很多方法(basedata.tabledplyr)来汇总分组数据。
  • 对不起,我想我误解了你的问题。仔细阅读(包括您的编辑),这似乎需要递归解决。干杯。
  • @Henrik liborm 的方法似乎对我有用

标签: r rounding


【解决方案1】:

您要做的基本上是对输入向量(带阈值)进行聚类,然后为每个聚类计算汇总统计量。像这样:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2021-10-14
    • 2022-01-17
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多