Импортируйте или проанализируйте файл txt во фрейм данных в формате R

#r #text-files #tidyverse

Вопрос:

Я пытаюсь импортировать текстовый файл в фрейм данных. Записи в текстовом файле разделены 56 тире. Файл выглядит так:

     --------------------------------------------------------
    Record: 1
    ColumnTitleABC: string of text
    ColumnTitleDEFG: string of text
    --------------------------------------------------------
    Record: 2
    ColumnTitleABC: string of text
    ColumnTitleDEFG: string of text
    --------------------------------------------------------
 

Я пробовал использовать read_delim("TextFileName.txt", delim = ":") .
Он просто возвращает заголовки столбцов без строк текста. Есть ли лучшая функция R для чтения в текстовом файле такого типа? Или, может быть, был бы какой-то способ проанализировать это в R, прежде чем перемещать его в фрейм данных?

Я бы хотел, чтобы конечным результатом был кадр данных, подобный этому:

     Record  ColumnTitleABC  ColumnTitleDEFG
    1       string of text  string of text
    2       string of text  string of text
 

Ответ №1:

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

 lines <- readLines('data.txt')

do.call(rbind, by(lines, cumsum(grepl('------', lines)), function(x) {
  x <- x[-1]
  name <- sub(':.*', '', x)
  value <- sub('.*:', '', x)
  setNames(as.data.frame(t(value)), name)
})) -> result

result
#    Record  ColumnTitleABC ColumnTitleDEFG
#1        1  string of text  string of text
#2        2  string of text  string of text
 
  • cumsum(grepl('------', lines)) создаст группы, которые будут отделять одну запись от другой.
  • x <- x[-1] делается это с тех пор, как 1-е значение в каждой группе-это просто ------ строка, поэтому мы ее удаляем.
  • name <- sub(':.*', '', x) удаляет все после двоеточия, чтобы получить имя столбца.
  • value <- sub('.*:', '', x) удаляет все перед двоеточием, чтобы получить значение.
  • setNames(as.data.frame(t(value)), name) создает фрейм данных 1 X 3.

Комментарии:

1. Ронак, это очень хорошо сработало при создании фрейма данных на основе того, как данные были отформатированы в текстовом файле. Спасибо вам также за пояснения с кодом.