R: как агрегировать по столбцу реальных значений с заданной погрешностью

Предполагая, что у меня есть фрейм данных:

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 группировать не по точному равенству, а по равенству с предоставленной погрешностью?

2 ответа

Решение

Вот подход с 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)

Эта работа с вашими игрушечными данными, я не знаю, с реальными, вам, возможно, придется округлить до более или менее цифр

aggregate(t, by=list(round(t$d2,4)), FUN=min)
Другие вопросы по тегам