2014-12-30 2 views
-2

Новое в РИ я использую str_extract_all из пакета stringr, чтобы попытаться извлечь координаты, которые в настоящее время в этом формате:R: RegEx для координаты

coordinate <- "{u'type': u'Point', u'coordinates': [-2.824602, 53.235397]}" 

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

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

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

coordinate x y 
"{u'type': u'Point', u'coordinates': [-2.824602, 53.235397]}" -2.824602 53.235397 
+0

Пакет stringr имеет опцию PERL – lmcshane

+0

так делать функции регулярных выражений базы R –

ответ

3

Это выглядит для работы:

> str_extract_all(coordinate, perl("-?\\d+\\.?\\d*")) 
[[1]] 
[1] "-2.824602" "53.235397" 

Полочка по-части: -? 0 или 1 отрицательные знаки, \\d+ ноль или более цифр, \\.? 0 или 1 десятичная точка (с экранированным метасимволом), \\d+ одна или несколько цифр.

Если coordinate вектор, вы можете получить его в матрицу, как это (не столь фантазии, как qdapRegex):

matrix(as.numeric(unlist(
     str_extract_all(rep(coordinate, 4), perl("-?\\d+\\.?\\d*")) 
)), ncol = 2, byrow = T) 
      [,1] [,2] 
[1,] -2.824602 53.2354 
[2,] -2.824602 53.2354 
[3,] -2.824602 53.2354 
[4,] -2.824602 53.2354 
+0

Упс, забыл, спасаясь от '.'. И я изменил этот последний '+' на '*'. Он по-прежнему не будет соответствовать десятичным знакам без ведущего 0 ... – Gregor

+0

Mmm, меняя первый + на * решает проблемы. – Gregor

+0

нет, теперь он соответствует '67.'. Я думаю, это неверный номер. Измените свой шаблон как '-? (?: \\ d + \\.)? \\ d +' –

4

Вот простой метод, использующий qdapRegex и read.csv

library(qdapRegex) 
read.csv(text = rm_square(coordinate, extract = TRUE)[[1]], header = FALSE) 
##   V1  V2 
## 1 -2.824602 53.2354 

Или если вы настаиваете на stringr, можете также сделать

read.csv(text = str_extract_all(coordinate, perl("(?<=\\[)[^']+(?=\\])"))[[1]], header = FALSE) 
+2

'qdap' теперь начинает иметь для меня больше смысла. Сначала было сложно –

5

Это похоже на json в виде символьной строки, поэтому я бы порекомендовал простой маршрут и использовал одну из функций разбора json.

RJSONIO::fromJSON(coordinate)[[2]] 
[1] -2.824602 53.235397 

Таким образом, вы также можете получить числовые значения в результате, вместо символов

+1

Ницца и просто. –

2

Вы можете использовать функцию str_extract_all из stringr библиотеки.

> str_extract_all(coordinate, perl("-?\\d+(?:\\.\\d+)?")) 
[[1]] 
[1] "-2.824602" "53.235397" 
  • -? Дополнительный дефис.
  • \\d+ Один или несколько цифр.
  • (?:\\.\\d+)? Необязательная группа, не связанная с захватом, используемая для соответствия десятичной части, если она существует. Нам нужно уйти от точки, потому что в регулярном выражении точка представляет собой специальный метасимвол, который соответствует любому символу. Чтобы соответствовать буквальной точке, вам необходимо избежать этого.
  • Причина для установки шаблона, используемого для соответствия десятичной части в необязательной группе, означает, что она будет соответствовать даже числу, которое имеет одну цифру.
+0

Спасибо за указание на мою ошибку - я думаю, что она исправлена. Ваше регулярное выражение будет извлекать '.4' или' -.4' как просто '4'. – Gregor

+0

Я думаю, что перед точкой должно быть число, например 0,4 –

+0

Надеюсь ... в зависимости от источника данных. – Gregor

1
> str_extract_all(coordinate, "[-.[:digit:]]+") 
[[1]] 
[1] "-2.824602" "53.235397" 
1

Вы также можете использовать gsub

scan(text=gsub('[^[]+[[]([-0-9,. ]+)[[:punct:]]+', 
       '\\1', coordinate),sep=",", quiet=TRUE) 
#[1] -2.824602 53.235397 
Смежные вопросы