R: удаление последних трех точек из строки

У меня есть текстовый файл данных, который я, вероятно, прочитаю с помощью readLines. Начальная часть каждой строки содержит много тарабарщины, за которой следуют нужные мне данные. Тарабарщина и данные обычно разделяются тремя точками. Я хотел бы разделить строки после последних трех точек или заменить последние три точки каким-либо маркером, сообщающим R, что все слева от этих трех точек следует рассматривать как один столбец.

Вот аналогичный пост на Stackoverflow, в котором будет найдена последняя точка:

R: найти последнюю точку в строке

Однако в моем случае некоторые данные содержат десятичные дроби, поэтому поиск последней точки будет недостаточно. Кроме того, я думаю, что ... имеет особое значение в R, что может усложнить проблему. Еще одна потенциальная сложность заключается в том, что некоторые точки больше других. Также в некоторых строках одна из трех точек была заменена запятой.

В дополнение к gregexprв посте выше я пытался использовать gsub, но не нашел решения.

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

aa = matrix(c(
'first string of junk... 0.2 0 1', 
'next string ........2 0 2', 
'%%%... ! 1959 ...  0 3 3',
'year .. 2 .,.  7 6 5',
'this_string   is . not fine .•. 4 2 3'), 
nrow=5, byrow=TRUE,
dimnames = list(NULL, c("C1")))

aa <- as.data.frame(aa, stringsAsFactors=F)
aa

# desired result
#                             C1  C2 C3 C4
# 1        first string of junk  0.2  0  1
# 2            next string .....   2  0  2
# 3             %%%... ! 1959      0  3  3
# 4                 year .. 2      7  6  5
# 5 this_string   is . not fine    4  2  3

Я надеюсь, что этот вопрос не будет считаться слишком конкретным. Текстовый файл данных был создан с использованием шагов, описанных в моем вчерашнем посте о чтении файла MSWord в R.

Некоторые строки не содержат тарабарщины или трех точек, а содержат только данные.Тем не менее, это может быть осложнением для последующего поста.

Спасибо за любой совет.

5
задан Community 23 May 2017 в 12:20
поделиться