3
votes

Conversion d'une chaîne de colonne en numérique dans un bloc de données r

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.


2 commentaires

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.


4 Réponses :


2
votes

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


0 commentaires

3
votes

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]])


3 commentaires

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.



3
votes

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"))


0 commentaires

0
votes

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


0 commentaires