Удалять символы после последнего появления разделителя - но сохранять символы, если разделитель встречается один раз в начале - PullRequest
1 голос
/ 27 мая 2020

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

Это очень похоже на Вопрос 1 , Вопрос 2 и вопрос 3 . У всех этих вопросов есть решение, которое удалялось бы после «каждого последнего» появления разделителя (чаще всего подчеркивания), в том числе когда он встречается в начале строки.

Мне нужно сохранить те строки, в которых разделитель встречается только один раз, в начале строки.

В примере для x[3] и x[5] я хотел бы сохранить «-3» и «-5». Моя первая попытка сохраняет -5, но не -3 ...

x <- c("1 - 2","2-1", "-3", "4", "-5-6")

gsub("(.*)\\-.*$", "\\1", x)
#> [1] "1 " "2"  ""   "4"  "-5"

gsub("\\-[^\\-].*$", "", x)
#> [1] "1 " "2"  ""   "4"  ""

edit Текущее решение Ronaks работает для предыдущего примера, но терпит неудачу, когда есть символы, отличные от "чисел" , либо до, либо после разделителя.

x <- c("1 - 2","2-1", "-3", "4", "-5-6", "-0.6", "20/200", "20/200-3")

stringr::str_match(x, '(-?\\d+)-?')[, 2]
#> [1] "1"  "2"  "-3" "4"  "-5" "-0" "20" "20"

желаемый результат

#> [1] "1"  "2"  "-3" "4"  "-5" "-0.6" "20/200" "20/200"

(Для любопытных: это для преобразования обозначений данных остроты зрения, которые говорят нам, насколько хорошо мы можем различать буквы на диаграмме. Это данные могут быть иногда очень беспорядочными, но обычно следуют определенному шаблону обозначений.)

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Это похоже на то, что вы хотите:

str_extract(x, "(-)?\\d+[.\\d/]*(?=-?)")
[1] "1"      "2"      "-3"     "4"      "-5"     "-0.6"   "20/200" "20/200"

Это соответствует необязательному -, за которым следует число из одной или нескольких цифр, за которым следует либо ., либо число, либо / ноль или более раз (*) слева от ((?= ...)) необязательного -

EDIT :

Решение base R:

unlist(regmatches(x, gregexpr("^(-)?\\d+[.\\d/]*(?=-?)", x, perl = T)))
[1] "1"      "2"      "-3"     "4"      "-5"     "-0.6"   "20/200" "20/200"

Данные:

x <- c("1 - 2","2-1", "-3", "4", "-5-6", "-0.6", "20/200", "20/200-3")
1 голос
/ 27 мая 2020

Использование str_match:

stringr::str_match(x, '(-?\\d+)-?')[, 2]
#[1] "1"  "2"  "-3" "4"  "-5"

Это захватывает необязательный "-", за которым следует число, за которым следует еще один необязательный "-".


Использование str_extract:

stringr::str_extract(x, '-?\\d+(?=-?)')

и в базе R:

sub("(-?\\d+)-?.*", "\\1", x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...