Условная замена на str_replace - PullRequest
3 голосов
/ 09 июня 2019

У меня есть такие данные:

d = as.character(c("1,23", "1,23.23", "1.23", "-1.2", "1,23.234"))

Если строка имеет знак пунктуации и запятую, я хочу удалить символы за знаком пунктуации и сам знак пунктуации.

Результат должен выглядеть следующим образом:

 d = as.character(c("1,23", "1,23", "1.23", "-1.2", "1,23")) 

Проблема в том, что я не могу использовать str_replace, потому что он также удалит другие строки.

library(stringr)

str_replace(d,"\\.[0-9]+", "")
[1] "1,23" "1,23" "1"    "-1"   "1,23"

Ответы [ 2 ]

4 голосов
/ 09 июня 2019

Мы можем сопоставить шаблон из одной или нескольких цифр, за которыми следуют запятая или точка и одна или несколько цифр, захватить как группу ((...)) и при замене использовать обратную ссылку (\\1) группы

sub("^(-?\\d+[,.]\\d+).*", "\\1", d)
#[1] "1,23" "1,23" "1.23" "-1.2" "1,23"

Или используйте тот же шаблон в str_replace

library(stringr)
str_replace(d, "^(-?\\d+[,.]\\d+).*", "\\1")
#[1] "1,23" "1,23" "1.23" "-1.2" "1,23"
1 голос
/ 09 июня 2019

Так как наши данные кажутся действительными, это выражение может работать, если будет хорошо использовать lookaround:

(?<=,)(.+)(\..+)

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

Наш код может выглядеть следующим образом:

str_replace(d, "(?<=,)(.+)(\..+)", "\\1")

или

sub("(?<=,)(.+)(\..+)", "\\1", d)

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...