3 votes

Considérer l'aller-retour de manière identique

J'ai des difficultés pour coder la variable route dans R de manière à ce qu'elle prenne une valeur unique lorsque la route est la même, indépendamment du point d'origine et de destination (L'origine est les 4 premiers caractères de la variable route et la destination est les 4 derniers). La base est la suivante :

base <- data.frame(route = c("SBAA - SBBE", "SBAA - SBBR", "SBAA - SBCI",
                            "SBBE - SBAA", "SBBE - SBBR", "SBBR - SBBE"),
                   seats = c(1231, 1021, 715, 989, 759, 695))
base <- as_tibble(base)

# A tibble: 6 x 2
      route        seats
      <chr>           <dbl>
    1 SBAA - SBBE     1231
    2 SBAA - SBBR     1021
    3 SBAA - SBCI      715 
    4 SBBE - SBAA      989 
    5 SBBE - SBBR      759 
    6 SBBR - SBBE      695 

J'ai pensé à faire une transformation pour générer le code variable :

code <-as.numeric (as.factor (route))

Cependant, le résultat sera différent pour les mêmes routes (mêmes aéroports de correspondance) mais avec des aéroports d'origine et de destination inversés. Par exemple, "SBAA - SBBE" et SBBE - SBAA "  devraient avoir le même code, mais ressembleront à ceci :

  route           seats       code
  <chr>           <dbl>       <dbl>
1 SBAA - SBBE     1231         1
2 SBAA - SBBR     1021         2
3 SBAA - SBCI      715         3
4 SBBE - SBAA      989         4
5 SBBE - SBBR      759         5
6 SBBR - SBBE      695         6 

J'ai besoin que les routes qui ont les mêmes aéroports de connexion aient le même code, de sorte que la variable de code renvoie le résultat suivant :

  route           seats       code
  <chr>           <dbl>       <dbl>
1 SBAA - SBBE     1231         1
2 SBAA - SBBR     1021         2
3 SBAA - SBCI      715         3
4 SBBE - SBAA      989         1
5 SBBE - SBBR      759         4
6 SBBR - SBBE      695         4

Notez que le code pour "SBAA - SBBE" est identique à "SBBE - SBAA". Merci pour votre aide.

2voto

akrun Points 148302

Si on extrait les mots, sort , paste et ensuite faire le factor a integer cela devrait fonctionner

library(dplyr)
library(stringr)
library(purrr)
base %>% 
    mutate(code = as.integer(factor(map_chr(str_extract_all(route, 
          "\\w+"), ~ str_c(sort(.x), collapse=" - ")))))

2voto

RyanD Points 6857

Même idée de tri, fait par lapplication sur la liste des fonctions list(pmin, pmax), en les appliquant à la strsplit de la première colonne pour créer deux colonnes avec chaque ligne maintenant triée. Ensuite, la colonne "code" est le numéro de groupe lors du regroupement par les 2 nouvelles colonnes.

library(data.table)
setDT(base)

base[, code := 
  base[, lapply(.(pmin, pmax), do.call, tstrsplit(route, ' - '))
      ][, g := .GRP, .(V1, V2)][['g']]
]

base
#          route seats code
# 1: SBAA - SBBE  1231    1
# 2: SBAA - SBBR  1021    2
# 3: SBAA - SBCI   715    3
# 4: SBBE - SBAA   989    1
# 5: SBBE - SBBR   759    4
# 6: SBBR - SBBE   695    4

Ou (même sortie)

base[, code := .GRP, 
     interaction(lapply(list(pmin, pmax), do.call, tstrsplit(route, ' - ')))]

1voto

LocoGris Points 3991

Utilisation de data.table :

base <- data.frame(route = c("SBAA - SBBE", "SBAA - SBBR", "SBAA - SBCI",
                             "SBEE - SBAA", "SBEE - SBBR", "SBBR - SBEE"),
                   seats = c(1231, 1021, 715, 989, 759, 695))
base <- as_tibble(base)

library(data.table)
base <- as.data.table(base)
base[, code:=paste0(sort(c(str_split(route, " - ")[[1]][1],str_split(route, " - ")[[1]][2])), collapse=" - "), by=1:nrow(base)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X