96 votes

Lire fichier texte à largeur fixe

Je suis en train de charger ce vilain format d'un jeu de données dans mon R session: http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for

Weekly SST data starts week centered on 3Jan1990

Nino1+2      Nino3        Nino34        Nino4
Week          SST SSTA     SST SSTA     SST SSTA     SST SSTA 
03JAN1990     23.4-0.4     25.1-0.3     26.6 0.0     28.6 0.3 
10JAN1990     23.4-0.8     25.2-0.3     26.6 0.1     28.6 0.3 
17JAN1990     24.2-0.3     25.3-0.3     26.5-0.1     28.6 0.3

Jusqu'à présent, je peux lire les lignes avec

  x = readLines(path)

Mais le fichier mélanges en l'espace blanc "avec" - " comme séparateurs, et je ne suis pas une regex expert. J'Apprécie toute l'aide sur le transformer en une agréable et propre R des données-cadre. merci!

192voto

Andrie Points 66979

C'est une largeur fixe de fichier. Utiliser read.fwf() de la lire:

x <- read.fwf(
  file=url("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for"),
  skip=4,
  widths=c(12, 7,4, 9,4, 9,4, 9,4))

head(x)

            V1   V2   V3   V4   V5   V6   V7   V8  V9
1  03JAN1990   23.4 -0.4 25.1 -0.3 26.6  0.0 28.6 0.3
2  10JAN1990   23.4 -0.8 25.2 -0.3 26.6  0.1 28.6 0.3
3  17JAN1990   24.2 -0.3 25.3 -0.3 26.5 -0.1 28.6 0.3
4  24JAN1990   24.4 -0.5 25.5 -0.4 26.5 -0.1 28.4 0.2
5  31JAN1990   25.1 -0.2 25.8 -0.2 26.7  0.1 28.4 0.2
6  07FEB1990   25.8  0.2 26.1 -0.1 26.8  0.1 28.4 0.3

56voto

Une autre façon de déterminer les largeurs...

df <- read.fwf(file=url("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for"), widths=c(-1,9,-5,4,4,-5,4,4,-5,4,4,-5,4,4), skip=4)

Le -1 dans les largeurs argument dit qu'il est un personnage de la colonne qui doit être ignoré,l'-5 dans les largeurs argument dit qu'il est de cinq caractères de la colonne qui doit être ignoré, de même...

ref : https://www.inkling.com/read/r-cookbook-paul-teetor-1st/chapter-4/recipe-4-6

20voto

James Holland Points 1

Tout d'abord, cette question est directement à partir de la Coursera "Obtenir des Données et de la Nettoyer" de cours par des Poireaux. Alors qu'il y a une autre partie de la question, la partie la plus difficile est de lire le fichier.

Cela dit, le cours est principalement destiné à l'apprentissage.

Je déteste R fixe de procédure à l'échelle. Il est lent et pour un grand nombre de variables, il devient très vite une douleur à nier certaines colonnes, etc.

Je pense que c'est plus facile à utiliser readLines et puis, de là utiliser substr pour faire vos variables

rm(list=ls(all=T))

x <- readLines(con=url("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for"))

# Skip 4 lines
x <- x[-(1:4)]

mydata <- data.frame(var1 = substr(x,1,10),
                     var2 = substr(x, 16,19),
                     var3 = substr(x, 20, 23),
                     var4 = substr(x, 29, 32)  # and so on and so on
                     )

4voto

11684 Points 4088

Je ne sais pas une chose sur R, mais je peux vous fournir avec une regex qui va correspondre à ces lignes:

\s[0-9]{2}[A-Z]{3}[0-9]{4}(\s{5}[0-9]+\.[0-9]+[ -][0-9]+\.[0-9]+){4}

Je suis désolé, c'est tellement long, je vais essayer de l'optimiser.

EDIT:
Ha, maintenant il s'adapte sur une seule ligne.

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