it-swarm.com.de

Lesen einer Textdatei mit mehreren Leerzeichen als Trennzeichen in R

Ich habe große Datenmengen, die aus 94 Spalten und 3 Millionen Zeilen bestehen. Diese Datei enthält sowohl einzelne als auch mehrere Leerzeichen als Trennzeichen zwischen Spalten. Ich muss einige Spalten aus dieser Datei in R lesen. Dazu habe ich versucht, read.table () mit Optionen zu verwenden, die im folgenden Code zu sehen sind. Der Code wird unten eingefügt.

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

Da die einzulesende Datei mehr als ein Leerzeichen als Trennzeichen zwischen einigen Spalten hat, funktioniert die obige Methode nicht. Gibt es eine Methode, mit der wir diese Datei effizient einlesen können? 

45
Pawan

Sie müssen Ihr Trennzeichen ändern. " " bezieht sich auf ein Leerzeichen. "" bezieht sich auf beliebige Längen-Whitespaces als Trennzeichen

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

Aus dem Handbuch:

Wenn sep = "" (Standardeinstellung für read.table) ist das Trennzeichen "Leerzeichen", dh ein oder mehrere Leerzeichen, Tabulatoren, Zeilenumbrüche oder Zeilenumbrüche.

Bei einer großen Datendatei möchten Sie möglicherweise data.table:::fread in Betracht ziehen, um Daten direkt in eine data.table einzulesen. Ich habe diese Funktion heute Morgen selbst verwendet. Es ist immer noch experimentell, aber ich finde, dass es sehr gut funktioniert.

65
Simon O'Hanlon

Wenn Ihr Feld eine feste Breite hat, sollten Sie read.fwf() in Betracht ziehen, um fehlende Werte besser zu behandeln.

1
cmbarbu

Wenn Sie stattdessen das Paket tidyverse (bzw. readr) verwenden möchten, können Sie stattdessen read_table verwenden. 

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

Und siehe hier in der Beschreibung: 

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