#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. Ронак, это очень хорошо сработало при создании фрейма данных на основе того, как данные были отформатированы в текстовом файле. Спасибо вам также за пояснения с кодом.