Calcular o valor médio entre linhas pareadas num dataframe

Boa tarde pessoal,

Estou com uma dúvida e não estou sabendo estruturar um loop para resolver. Tenho um dataframe que me diz o nome da cidade1, nome da cidade 2 e a distancia entre elas. Entretanto, nem sempre a distancia entre duas cidades será a mesma, sendo assim gostaria de calcular a distancia média entre elas. Um exemplo pode ser visto entre as cidades A e B. A distancia de A até B = 17 e de B até A = 15.5.
Como eu poderia fazer para calcular a distância média entre várias cidades de uma vez? De preferência que o resultado que me voltasse apresentasse apenas 1 linha para cada par de cidades, por exemplo:
cidade1 cidade2 dist_media
A B 16.25

Segue um exemplo reprodutível:

library(tidyverse)
#> Warning: package 'ggplot2' was built under R version 4.1.3
#> Warning: package 'tibble' was built under R version 4.1.3
#> Warning: package 'dplyr' was built under R version 4.1.3
df <- data.frame(
  cidade1 = c("A", "B", "C", "D", "E", "F"),
  cidade2 = c("B", "A", "D", "C", "F", "E"),
  distancia = c(17, 15.5, 21, 19, 12, 15)
)

df
#>   cidade1 cidade2 distancia
#> 1       A       B      17.0
#> 2       B       A      15.5
#> 3       C       D      21.0
#> 4       D       C      19.0
#> 5       E       F      12.0
#> 6       F       E      15.0

filter(df, cidade1 == "A" & cidade2 == "B" |
         cidade1 == "B" & cidade2 == "A") |> 
  mutate(dist_media = mean(distancia)) 
#>   cidade1 cidade2 distancia dist_media
#> 1       A       B      17.0      16.25
#> 2       B       A      15.5      16.25

Agradeço desde já!

Oi Laila, tudo bem?
Com esse exemplo, eu pensei em fazer assim:

df <- data.frame(
  cidade1 = c("A", "B", "C", "D", "E", "F"),
  cidade2 = c("B", "A", "D", "C", "F", "E"),
  distancia = c(17, 15.5, 21, 19, 12, 15)
)

df |> 
  # unindo em uma unica coluna
  tidyr::unite(c(cidade1, cidade2), col = "cidades", remove = FALSE, sep = "") |> 
  # ordena os valores dessa coluna
  dplyr::mutate(cidades_ord = stringr::str_split(cidades, "") |> 
                  purrr::map_chr(~sort(.) |>  paste(collapse = ""))) |> 
  # agrupa
  dplyr::group_by(cidades_ord) |> 
  # calcula média
  dplyr::summarise(media_distancia = mean(distancia))
#> # A tibble: 3 × 2
#>   cidades_ord media_distancia
#>   <chr>                 <dbl>
#> 1 AB                     16.2
#> 2 CD                     20  
#> 3 EF                     13.5

Created on 2022-05-25 by the reprex package (v2.0.1)

2 Curtidas

Funcionou perfeitamente. Muito obrigada Bea :slight_smile: