Я пытаюсь прочитать текстовый файл, используя read.table() в R. R не читает ничего, что следует за #. Однако в тексте есть символы решетки, не имеющие отношения к комментариям. Я хочу удалить ненужные символы # без добавления комментариев к фрейму данных.

К счастью, все символы фунта, которые я хочу сохранить, находятся в первом элементе каждой строки. Поэтому в основном мне нужно удалить все символы #, которых нет в первом элементе строки.

2018-08-14 00:00:42 102.18.18.2  
2018-08-15 00:00:47 223.45.67.8    
2018-08-15 00:00:48 026.15.65.0    
2018-08-15 00:00:49 924.43.47.0    
2018-08-15 00:00:49 122.45.#67.9

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

1
andrew_will 22 Сен 2018 в 04:20

2 ответа

Лучший ответ

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

Просто откройте файл в редакторе, который поддерживает поиск текста с помощью RegEx, например VS Code.

В поле Найти напишите: (. +) (#)

В поле замены напишите: $ 1

Нажатие кнопки «Заменить все» должно удалить все символы # между текстами.

В качестве альтернативы вы также можете написать сценарий для этого.

1
Achilles 22 Сен 2018 в 01:37

Вот возможное решение на чистом R:

MWE

Сначала давайте сделаем вашу проблему полной MWE (https://stackoverflow.com/help/mcve):

cat(
'#2018-08-14 00:00:42 102.18.18.2',
'2018-08-14 00:00:42 102.18.18.2',  
'2018-08-15 00:00:47 223.45.67.8',    
'2018-08-15 00:00:48 026.15.65.0',    
'2018-08-15 00:00:49 924.43.47.0',    
'2018-08-15 00:00:49 122.45.#67.9', sep = '\n', file = 'mytable.txt')

Это создает файл в вашем рабочем каталоге, который мы можем читать.

Решение

(x <- readLines('mytable.txt')) 
(y <- gsub('(?<!^)#', '', x, perl = TRUE))
read.table(text = y)

##           V1       V2          V3
## 1 2018-08-14 00:00:42 102.18.18.2
## 2 2018-08-15 00:00:47 223.45.67.8
## 3 2018-08-15 00:00:48 026.15.65.0
## 4 2018-08-15 00:00:49 924.43.47.0
## 5 2018-08-15 00:00:49 122.45.67.9

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

Волшебство происходит со строкой gsub('(?<!^)#', '', x, perl = TRUE). Он использует отрицательный просмотр назад (https://www.regular-expressions.info/lookaround.html) of (?<!^)# и может читаться как:

  • # (любой знак фунта) НО
  • ? (что) < (предшествует)
  • ! (нет)
  • ^ (начало строки)
0
Tyler Rinker 22 Сен 2018 в 14:55