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?
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.
Si votre champ a une largeur fixe, vous devriez envisager d'utiliser read.fwf()
qui pourrait mieux gérer les valeurs manquantes.
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.