web-dev-qa-db-fra.com

Lecture d'un fichier texte avec plusieurs espaces comme délimiteur dans R

J'ai un ensemble de données volumineuses composé d'environ 94 colonnes et de 3 millions de lignes. Ce fichier comporte des espaces simples et multiples comme séparateurs entre les colonnes. J'ai besoin de lire quelques colonnes de ce fichier dans R. Pour cela, j'ai essayé d'utiliser read.table () avec des options visibles dans le code ci-dessous, le code est collé ci-dessous -

### Defining the columns to be read from the file, the first 5 column, then we do not read next 24, after this we read next 5 columns. Last 60 columns are not read in-

    col_classes = c(rep("character",2), rep("numeric", 3), rep("NULL",24), rep("numeric", 5), rep("NULL", 60))   

### Reading first 100 rows of the data

    data <- read.table(file, sep = " ",header = F, nrows = 100, na.strings ="", stringsAsFactors= F)

Comme le fichier qui doit être lu a plus d’un espace comme séparateur entre certaines des colonnes, la méthode ci-dessus ne fonctionne pas. Existe-t-il une méthode permettant de lire efficacement ce fichier? 

45
Pawan

Vous devez changer votre délimiteur. " " fait référence à un caractère d'espacement. "" fait référence à tout espace de longueur en tant que délimiteur

 data <- read.table(file, sep = "" , header = F , nrows = 100,
                     na.strings ="", stringsAsFactors= F)

Du manuel:

Si sep = "" (par défaut pour read.table), le séparateur est un "espace blanc", c’est-à-dire un ou plusieurs espaces, tabulations, nouvelles lignes ou retours à la ligne.

De plus, avec un fichier de données volumineux, vous pouvez envisager d'utiliser data.table:::fread pour lire rapidement les données directement dans un fichier data.table. J'utilisais moi-même cette fonction ce matin. C'est encore expérimental, mais je trouve que ça fonctionne vraiment très bien.

65
Simon O'Hanlon

Si votre champ a une largeur fixe, vous devriez envisager d'utiliser read.fwf() qui pourrait mieux gérer les valeurs manquantes.

1
cmbarbu

Si vous souhaitez utiliser le package tidyverse (ou readr respectivement), vous pouvez utiliser read_table à la place. 

read_table(file, col_names = TRUE, col_types = NULL,
  locale = default_locale(), na = "NA", skip = 0, n_max = Inf,
  guess_max = min(n_max, 1000), progress = show_progress(), comment = "")

Et voir ici dans la description: 

read_table() and read_table2() are designed to read the type of textual data where
each column is #' separate by one (or more) columns of space.
0
littlebird