Извлечение строкового текста перед пробелом - PullRequest
1 голос
/ 21 мая 2019

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

[231] "34.05" "35.05" "36.05" "37.05" "1.09 " "2.09 " "3.09 " "4.09 " "5.09 " "6.09 "
[241] "7.09 " "8.09 " "9.09 " "46.86" "1.9 y" "2.9 y" "3.9 y" "4.9 y" "5.9 y" "6.9 y"

Некоторые записи в порядке, например, "37.05", но некоторые мы ошибочно извлечены, например, "4.9 y ". Я хочу извлечь только части каждой записи.

Что у меня есть:

data = stringr::str_extract(data, "([^/]+)(?=:space:)")

Но я получаю кучу АН. Как мне подойти к этому?

Ответы [ 3 ]

2 голосов
/ 21 мая 2019

Вы хотите получить значения с плавающей точкой в ​​начале строки, поэтому используйте

x <- c("33.72", "34.72", "35.72", "36.72", "37.72", "29.05", "30.05", "31.05", "32.05", "33.05",
       "34.05", "35.05", "36.05", "37.05", "1.09 ", "2.09 ", "3.09 ", "4.09 ", "5.09 ", "6.09 ",
       "7.09 ", "8.09 ", "9.09 ", "46.86", "1.9 y", "2.9 y", "3.9 y", "4.9 y", "5.9 y", "6.9 y")
as.double(sub("^(\\d+\\.\\d+).*", "\\1", x))

См. R демо онлайн и regex demo .

Подробности :

  • ^ - начало строки
  • (\\d+\\.\\d+) - Группа захвата 1 (обозначается \1 из шаблона замены): 1 или более цифр, точка и затем 1+ цифр
  • .* - любые 0 или более символов, как можно больше.

ПРИМЕЧАНИЕ : Если могут быть числа и целые числа, используйте as.double(sub("^(\\d+(?:\\.\\d+)?).*", "\\1", x)).

См. График регулярных выражений :

enter image description here

1 голос
/ 21 мая 2019

Еще проще с parse_number из пакета readr

> library(readr)
> parse_number(x)
 [1] 33.72 34.72 35.72 36.72 37.72 29.05 30.05 31.05 32.05 33.05 34.05 35.05 36.05 37.05  1.09  2.09  3.09  4.09  5.09
[20]  6.09  7.09  8.09  9.09 46.86  1.90  2.90  3.90  4.90  5.90  6.90

Вы даже можете изменить свой фактический паттерн с "([^/]+)(?=:space:)" на "\\d+\\.\\d*":

stringr::str_extract(x, "\\d+\\.\\d*")
1 голос
/ 21 мая 2019

Вы можете удалить все, что не является цифрой или точкой.

as.double(gsub("[^0-9\\.]+", "", x))
# [1] 33.72 34.72 35.72 36.72 37.72 29.05 30.05 31.05 32.05 33.05 34.05 35.05 36.05 37.05
#[15]  1.09  2.09  3.09  4.09  5.09  6.09  7.09  8.09  9.09 46.86  1.90  2.90  3.90  4.90
#[29]  5.90  6.90

data

x <- c("33.72", "34.72", "35.72", "36.72", "37.72", "29.05", "30.05", "31.05", "32.05", "33.05",
       "34.05", "35.05", "36.05", "37.05", "1.09 ", "2.09 ", "3.09 ", "4.09 ", "5.09 ", "6.09 ",
       "7.09 ", "8.09 ", "9.09 ", "46.86", "1.9 y", "2.9 y", "3.9 y", "4.9 y", "5.9 y", "6.9 y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...