Как удалить последнюю строку в текстовом файле в R? - PullRequest
0 голосов
/ 29 мая 2020

Я читаю текстовый файл, содержащий данные со строкой «проблема c». Последняя строка, начинающаяся с * ПРИМЕЧАНИЕ, должна быть удалена (количество строк в текстовом файле не всегда одинаково):

ColumnA ColumnB ColumnC
A2  17  14
B2  20  -1
C2  21  36

*NOTE: -1 = data do not exist

Это моя строка для чтения текстового файла (я должен выбрать текстовый файл, так как его местоположение не является постоянным:

my_data <- read.delim(file.choose(), header = TRUE, sep = "", quote = "",
                      dec = ".", fill = TRUE, comment.char = "")

Я пробовал:

my_data[- grep("*NOTE:", my_data$ColumnA),]

Но, похоже, он не работает. Какие-нибудь простые решения?

Ответы [ 2 ]

4 голосов
/ 29 мая 2020

Вы можете вызвать read.delim с помощью comment.char = "*":

my_data <- read.delim(file.choose(), header = TRUE, sep = "", quote = "",
                      dec = ".", fill = TRUE, comment.char = "*")

Это приведет к удалению последней строки, когда вы ее читаете, потому что она начинается с *.

Другой вариант: fread от data.table. fread имеет необычную функцию autostart, которая автоматически отбрасывает строки без ожидаемого количества столбцов:

library(data.table)
fread(file.choose())
1 голос
/ 29 мая 2020

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

read_broken <- function(file_path, filter_out = "^[*]NOTE:")
{
  if(missing(file_path)) file_path <- file.choose()
  x <- suppressWarnings(readLines(file_path))
  x <- x[nzchar(x)]
  x <- x[!apply(sapply(filter_out, grepl, x), 1, any)]
  read.delim(text = x, header = TRUE, sep = "", quote = "", dec = ".", fill = TRUE)
}

Итак, вы можете сделать:

read_broken("myfile.txt")
#>   ColumnA ColumnB ColumnC
#> 1      A2      17      14
#> 2      B2      20      -1
#> 3      C2      21      36

Или

read_broken("myfile.txt", filter_out = c("^[*]NOTE:", "A2"))
#>   ColumnA ColumnB ColumnC
#> 1      B2      20      -1
#> 2      C2      21      36
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...