#r #dataframe #duplicates
#r #dataframe #дубликаты
Вопрос:
У меня есть такие данные
B A Distance
1: 1101053 1102060 3.8
2: 1101053 1102065 6.1
3: 1101053 1102067 5.8
4: 1101053 1102068 4.0
5: 1101053 1102069 5.1
6: 1101053 1102069 6.0
7: 1101053 1102069 7.0
8: 1101053 1102069 6.6
9: 1101053 1102069 6.6
10: 1101053 1103051 4.3
11: 1101053 1103052 5.6
В строках с 5 по 9 они имеют одинаковые значения в столбцах B, A, но на разных расстояниях.
если бы я должен был объединить их с одним расстоянием (наименьшим), каким было бы лучшее решение?
Ожидаемый результат будет
B A Distance
1: 1101053 1102060 3.8
2: 1101053 1102065 6.1
3: 1101053 1102067 5.8
4: 1101053 1102068 4.0
5: 1101053 1102069 5.1
6: 1101053 1103051 4.3
7: 1101053 1103052 5.6
Я был бы признателен за некоторую помощь
Ответ №1:
Вы можете группировать и принимать минимальное значение:
dat <- read.table(header=TRUE, text="
B A Distance
1101053 1102060 3.8
1101053 1102065 6.1
1101053 1102067 5.8
1101053 1102068 4.0
1101053 1102069 5.1
1101053 1102069 6.0
1101053 1102069 7.0
1101053 1102069 6.6
1101053 1102069 6.6
1101053 1103051 4.3
1101053 1103052 5.6")
Решение с использованием data.table
:
library(data.table)
setDT(dat)
dat[, .(Distance = min(Distance)), by=.(B, A)]
#> B A Distance
#> 1: 1101053 1102060 3.8
#> 2: 1101053 1102065 6.1
#> 3: 1101053 1102067 5.8
#> 4: 1101053 1102068 4.0
#> 5: 1101053 1102069 5.1
#> 6: 1101053 1103051 4.3
#> 7: 1101053 1103052 5.6
Решение с использованием tidyverse
:
library(dplyr)
dat %>%
group_by(B, A) %>%
summarize(Distance = min(Distance))
#> # A tibble: 7 x 3
#> # Groups: B [1]
#> B A Distance
#> <int> <int> <dbl>
#> 1 1101053 1102060 3.8
#> 2 1101053 1102065 6.1
#> 3 1101053 1102067 5.8
#> 4 1101053 1102068 4
#> 5 1101053 1102069 5.1
#> 6 1101053 1103051 4.3
#> 7 1101053 1103052 5.6
Комментарии:
1. Большое спасибо за краткое объяснение!
Ответ №2:
Работает ли это:
library(dplyr)
df %>% group_by(B, A) %>% filter(Distance == min(Distance))
# A tibble: 7 x 3
# Groups: B, A [7]
B A Distance
<dbl> <dbl> <dbl>
1 1101053 1102060 3.8
2 1101053 1102065 6.1
3 1101053 1102067 5.8
4 1101053 1102068 4
5 1101053 1102069 5.1
6 1101053 1103051 4.3
7 1101053 1103052 5.6
Ответ №3:
Другой вариант с slice_min
library(dplyr)
df %>%
group_by(B, A) %>%
slice_min(Distance, n = 1)
# A tibble: 7 x 3
# Groups: B, A [7]
# B A Distance
# <int> <int> <dbl>
#1 1101053 1102060 3.8
#2 1101053 1102065 6.1
#3 1101053 1102067 5.8
#4 1101053 1102068 4
#5 1101053 1102069 5.1
#6 1101053 1103051 4.3
#7 1101053 1103052 5.6