J'ai un dataframe qui a une colonne de chaînes comme suit:
mydata <- c("-1.356670,35.355030", "-1.356670,35.355030", "-1.356620,35.355890", "-1.356930,35.358660", "-1.357000,35.359060" ) df <- data.frame(mydata)
Je veux le convertir en un dataframe contenant deux colonnes " long
et lat
, chacun étant de type numérique. Quelle est la meilleure façon de procéder? J'ai essayé d'utiliser lapply
, mais je n'arrive pas à le faire fonctionner.
4 Réponses :
Une solution tidyverse
.
library(tidyverse) dat <- df %>% separate(mydata, into = c("Long", "Lat"), sep = ",", convert = TRUE) # Print the data dat # Long Lat # 1 -1.35667 35.35503 # 2 -1.35667 35.35503 # 3 -1.35662 35.35589 # 4 -1.35693 35.35866 # 5 -1.35700 35.35906
Avec la base R vous pouvez faire:
setDT(df)[, c("lat", "long") := tstrsplit(mydata, ",", fixed = TRUE)]
Ou avec tstrsplit ()
depuis data.table
:
XXX
Aussi avec tstrsplit ()
de data.table
comme proposé par @clmarquart:
df$Long <- as.numeric(tstrsplit(df$mydata, ",")[[1]]) df$Lat <- as.numeric(tstrsplit(df$mydata, ",")[[2]])
Vous pouvez les combiner en un seul appel si vous êtes intéressé: matrix (as.numeric (unlist (lapply (df $ mydata, strsplit, split = ","))), byrow = T, nrow = 2)
Ou si vous utilisez data.table
, si vous créez d'abord une data.table
( dt = data.table (df)
), vous peut également le faire de cette façon: dt [ c ('lat', 'long'): = tstrsplit (mydata, ",", fixed = T)] []
@clmarquart merci pour vos remarques. J'aime votre possibilité data.table
, alors je l'ai ajoutée à mon message.
Cela peut être fait en une ligne dans la base R:
long lat 1 -1.35667 35.35503 2 -1.35667 35.35503 3 -1.35662 35.35589 4 -1.35693 35.35866 5 -1.35700 35.35906
donnant:
read.table(text = as.character(df$mydata), sep = ",", col.names = c("long", "lat"))
En utilisant strsplit
avec do.call
, il suffit alors d'attribuer le nom des colonnes
newdf=do.call(rbind.data.frame, strsplit(mydata,',')) names(newdf)=c('long','lat') newdf long lat 1 -1.356670 35.355030 2 -1.356670 35.355030 3 -1.356620 35.355890 4 -1.356930 35.358660 5 -1.357000 35.359060
L'exemple que vous avez fourni n'est pas un bloc de données, mais un vecteur.
donc c'est. Je vais le mettre à jour.