Подтвердить что ты не робот

Чтение текстового файла с несколькими пробелами в качестве разделителя в R

У меня есть большой набор данных, который состоит из 94 столбцов и 3 миллиона строк. Этот файл имеет один и несколько пробелов в качестве разделителя между столбцами. Мне нужно прочитать некоторые столбцы из этого файла в R. Для этого я попытался использовать read.table() с параметрами, которые можно увидеть в коде ниже, код будет вставлен ниже -

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

Так как файл, который должен быть прочитан, имеет более одного пространства в качестве разделителя между некоторым столбцом, этот метод не работает. Есть ли какой-либо метод, который мы можем прочитать в этом файле эффективно.

4b9b3361

Ответ 1

Вам нужно изменить разделитель. " " относится к одному символу пробела. "" относится к пробелу любой длины как разделитель

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

Из руководства:

Если sep = "(по умолчанию для read.table), разделитель представляет собой" пробел", то есть одно или несколько пробелов, табуляции, новые строки или возврат каретки.

Кроме того, с большим файлом данных вы можете рассмотреть data.table:::fread, чтобы быстро считывать данные прямо в таблицу данных. Я сам использовал эту функцию сегодня утром. Он все еще экспериментальный, но я считаю, что он работает очень хорошо.

Ответ 2

Если вы хотите вместо этого использовать пакет tidyverse (или readr соответственно), вы можете использовать вместо него read_table.

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

И смотрите здесь в описании:

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.

Ответ 3

Если поле имеет фиксированную ширину, вам следует использовать read.fwf(), который лучше обрабатывал бы отсутствующие значения.