【问题标题】:R: how to aggregate by real values column with given error toleranceR:如何通过具有给定容错的实数值列进行聚合
【发布时间】:2018-02-23 20:34:32
【问题描述】:

假设我有一个数据框:

t <- data.frame(d1=c( 694, 695, 696, 2243, 2244, 2651, 2652 ),
                d2=c(1.80950881, 1.80951007, 1.80951052, 1.46499982, 1.46500087, 1.14381419, 1.14381319 ))

    d1       d2
1  694 1.809509
2  695 1.809510
3  696 1.809511
4 2243 1.465000
5 2244 1.465001
6 2651 1.143814
7 2652 1.143813

我想按列d2 具有非常接近但不完全相等的值的实际值进行分组。因此,在这个例子中,经过聚合后,我想得到如下数据集:

    d1       d2
1  694 1.809509
2 2243 1.465000
3 2652 1.143813

从每组中取出具有最小d2 值的行。

使用aggregate函数,我的第一次尝试:

aggregate(t, by=list(t$d2), FUN=min)
   Group.1   d1       d2
1 1.143813 2652 1.143813
2 1.143814 2651 1.143814
3 1.465000 2243 1.465000
4 1.465001 2244 1.465001
5 1.809509  694 1.809509
6 1.809510  695 1.809510
7 1.809511  696 1.809511

远未达到我的目标。

我如何告诉aggregate 分组不是完全相等,而是根据提供的容错相等?

【问题讨论】:

    标签: r group-by aggregate


    【解决方案1】:

    这是一种使用 tidyverse 的方法:

    library(tidyverse)
    t %>%
      group_by(round(d2, 1)) %>% #group by rounded d2
      filter(d2 == min(d2)) %>% #filter min d1 in each group
      ungroup() %>% #ungroup so you can remove the grouping column
      select(-3)
    

    【讨论】:

    • 这个产生了我期望的精确结果。谢谢!
    【解决方案2】:

    这适用于您的玩具数据,我不知道真实数据,您可能需要四舍五入到更多或更少的数字

    aggregate(t, by=list(round(t$d2,4)), FUN=min)
    

    【讨论】:

    • 太棒了!这几乎就是我需要的。唯一需要注意的是,我从所有列中获取所有最小值,而不是“每个组中具有最小 d2 值的行”,因此结果集包含来自一个初始行的 d1 和来自另一个初始行的 d2。
    • soy你想从d2中得到最小值和对应的d1值吗?
    • 问题中的示例希望能很好地说明我的目标。您的建议产生了非常接近的结果,但第三行是 2651 1.143813 而不是我预期的 2652 1.143813
    • 我明白了,我认为另一个答案正是你想要的,我不知道如何使用聚合函数来准确地得到你想要的
    • 感谢您的建议。我喜欢它的极简主义,并且会考虑我是否可以按原样使用它。
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2017-02-23
    • 2022-01-11
    • 1970-01-01
    • 2018-06-02
    • 2020-06-15
    相关资源
    最近更新 更多