Reproduire avec R base les résultats d'une fonction de tidyr

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Romuald Riem
Messages : 14
Enregistré le : 18 Déc 2007, 11:09

Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Romuald Riem » 14 Mai 2019, 08:46

Bonjour,

Je sollicite votre expertise pour le problème suivant sur lequel je bloque depuis trop longtemps.

Dans un dataframe C, je dispose dans une variable t des coordonnées de 258 points qui sont stockées sous forme de caractères au format "longitude décimale" , "latitude décimale". Je précise que le nombre de décimales est variable.


En voici un échantillon:

Code : Tout sélectionner

"-0.13793,51.513418"
"-0.137883,51.513361"
"-0.137853,51.513317"
"-0.137812,51.513262"
"-0.137767,51.513204"
"-0.137537,51.513184"


Je souhaite obtenir deux nouvelles variables dans ce dataframe (longitude et latitude) pour pouvoir réaliser une carte.

Avec le package tidyr, j'obtiens le résultat en une ligne:

Code : Tout sélectionner

library(tidyr)
C <- separate(C, t, c("longitude", "latitude"), sep = ",", convert = TRUE)


Le problème est que je vais partager ce code avec d'autres utilisateurs et que je ne souhaite pas leur imposer l'utilisation de tidyr.
J'essaye donc de reproduire ce résultat avec les fonctions de base mais j’aboutis rapidement à des impasses (par exemple après l'utilisation de strsplit, j'obtiens de listes dont je ne réussi pas à extraire les informations...).

Pourriez-vous me donner des pistes à suivre ou de la documentation à étudier ?

Avec mes remerciements

Mickael Canouil
Messages : 555
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Mickael Canouil » 14 Mai 2019, 08:54

Bonjour,

voici en R base, une possibilité basée sur votre exemple:

Code : Tout sélectionner

C <- data.frame(
  t = c(
    "-0.13793,51.513418", "-0.137883,51.513361", "-0.137853,51.513317",
    "-0.137812,51.513262", "-0.137767,51.513204", "-0.137537,51.513184"
  ),
  stringsAsFactors = FALSE
)

Cbis <- do.call("rbind", strsplit(x = C[["t"]], split = ","))
class(Cbis) <- "numeric"
colnames(Cbis) <- c("longitude", "latitude")
Cbis <- as.data.frame(Cbis)
Cbis
#>   longitude latitude
#> 1 -0.137930 51.51342
#> 2 -0.137883 51.51336
#> 3 -0.137853 51.51332
#> 4 -0.137812 51.51326
#> 5 -0.137767 51.51320
#> 6 -0.137537 51.51318


Cordialement,
Mickaël

Logez Maxime
Messages : 2890
Enregistré le : 26 Sep 2006, 11:35

Re: Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Logez Maxime » 14 Mai 2019, 09:34

Bonjour,

Tu peux aussi inverser l'ordre des opérations et jouer sur le rendu de la fonction sapply (qui est la même chose que le lapply mais qui renvoie un vecteur ou une matrice si les résultats sont de même longueur) :

Code : Tout sélectionner

res <- t(sapply(strsplit(C$t, ","), as.numeric))
colnames(res) <- c("Longitude", "Latitude")
res <- as.data.frame(res)
# ou encore :
Cbis <- data.frame(Longitude = gsub("\\,.+$", "", C$t),
  Latitude = gsub("^.+\\,", "", C$t), stringsAsFactors= FALSE)
Cbis[1:2] <- lapply(Cbis, as.numeric)
Cordialement,
Maxime

Romuald Riem
Messages : 14
Enregistré le : 18 Déc 2007, 11:09

Re: Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Romuald Riem » 14 Mai 2019, 10:25

Merci pour vos réponses rapides.

Il ne me reste plus maintenant qu'a en comprendre le fonctionnement, pour pouvoir adapter vos propositions à mes besoins.

Pierre-Yves Berrard
Messages : 686
Enregistré le : 12 Jan 2016, 23:30

Re: Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Pierre-Yves Berrard » 16 Mai 2019, 13:01

Bonjour,

Une autre idée :

Code : Tout sélectionner

read.csv(
  text = C$t,
  header = FALSE,
  col.names = c("longitude", "latitude")
)
PY

Gabriel Terraz
Messages : 533
Enregistré le : 26 Sep 2011, 15:11

Re: Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Gabriel Terraz » 16 Mai 2019, 17:12

J'aime bien cette dernière solution, c'est plutôt rigolo comme astuce

Pierre-Yves Berrard
Messages : 686
Enregistré le : 12 Jan 2016, 23:30

Re: Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Pierre-Yves Berrard » 16 Mai 2019, 18:30

Content de t'avoir distrait. ;-)
PY

Logez Maxime
Messages : 2890
Enregistré le : 26 Sep 2006, 11:35

Re: Reproduire avec R base les résultats d'une fonction de tidyr

Messagepar Logez Maxime » 17 Mai 2019, 13:04

La solution est très ingénieuse et très efficace, bien plus que les autres.

Sur le tableau C répété 1000 fois (soit 6000 lignes) :

Code : Tout sélectionner

Unit: milliseconds
   expr      min        lq      mean    median        uq      max neval  cld
  Split 68.65633  76.94850  84.18037  81.85585  87.64611 189.5595  1000  b 
 Sapply 75.17491  81.13471  85.58490  84.08647  87.13773 184.3518  1000   c
   Gsub 93.30083 100.75369 104.09690 103.70168 106.43559 203.1543  1000    d
    CSV 32.28179  35.61867  37.33780  36.71454  38.21383 123.3769  1000 a

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité