Извлечение данных о местоположении с помощью регулярного выражения в R

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

{'id': 19847005, 'profile_sidebar_fill_color': u'http://pbs.foo.com/profile_background', 'profile_text_color': u'333333', 'followers_count': 1105, 'location': u'San Diego, CA', 'profile_background_color': u'9AE4E8', 'listed_count': 43, '009', 'time_zone': u'Pacific Time (US & Canada)', 'protected': False}

Я хочу извлечь данные о местоположении из этого текста: Сан-Диего, Калифорния.

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

location_pattern <- "'location':\su'(\w+)'"
rawdata$location <- str_extract(rawdata$user, location_pattern)

person lmcshane    schedule 30.12.2014    source источник
comment
Это похоже на строку JSON. Почему бы вам не использовать для этого fromJSON(...) в пакете rjson??   -  person jlhoward    schedule 30.12.2014
comment
@jlhoward. почему ты всегда используешь (несколько драматично) двойные вопросительные знаки?   -  person David Arenburg    schedule 30.12.2014
comment
Просто интересно, это реальный пример? Предложение: 'listed_count': 43, '009', ... недопустимо json.   -  person jlhoward    schedule 30.12.2014
comment
@jlhoward это сокращенно json для простоты.   -  person lmcshane    schedule 30.12.2014


Ответы (3)


Вы могли бы попробовать

str_extract_all(str1, perl("(?<=location.: u.)[^']+(?=')"))[[1]]
#[1] "San Diego, CA"
person akrun    schedule 30.12.2014
comment
Это хорошая комбинация взгляда назад и вперед. - person David Arenburg; 30.12.2014
comment
@DavidArenburg Спасибо, но неясно, похож ли шаблон в исходном наборе данных или нет. - person akrun; 30.12.2014
comment
@akrun, если бы я хотел извлечь вывод в виде кадра данных, как бы я это сделал? - person lmcshane; 30.12.2014
comment
@ user3813578 Но это был не первоначальный вопрос. Я был в отъезде, но я думаю, вы уже получили другой ответ относительно извлечения как data.frame. Когда вы публикуете вопрос, пожалуйста, будьте ясны. - person akrun; 31.12.2014

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

Функция str_extract использует расширенные регулярные выражения POSIX, которые не понимают \w и \s, они специфичны для регулярных выражений Perl. Вместо этого вы можете использовать функцию perl в пакете stringr, и тогда она распознает ярлыки, или вы можете использовать [[:space:]] вместо \s и [[:alnum:]_] вместо \w, хотя, скорее всего, вам понадобится что-то вроде [[:alpha], ] или [^'].

Кроме того, синтаксический анализатор строк R анализирует строку до того, как она будет передана функции сопоставления, поэтому вам понадобятся \\s и \\w, если вы используете функцию perl (или другую функцию регулярных выражений в R). первый \ экранирует второй, так что один \ остается в строке, которая интерпретируется как часть регулярного выражения.

person Greg Snow    schedule 30.12.2014
comment
спасибо! Я уже давно не понимаю, как работает Perl! - person lmcshane; 31.12.2014
comment
Были также некоторые проблемы с кодировкой, которые я не очень силен объяснять. u' и '009' например. Я считаю, что '009' - это юникод для разрыва строки? Я пробовал enc2utf8, но это ничего не изменило. - person Rich Scriven; 31.12.2014

Это похоже на строку json, но если вас это не слишком беспокоит, то, возможно, это поможет.

library(stringi)

ss <- stri_split_regex(x, "[{}]|u?'|(, '(009')?)|: ", omit=TRUE)[[1]]
(m <- matrix(ss, ncol = 2, byrow = TRUE))
#      [,1]                         [,2]                                   
# [1,] "id"                         "19847005"                             
# [2,] "profile_sidebar_fill_color" "http://pbs.foo.com/profile_background"
# [3,] "profile_text_color"         "333333"                               
# [4,] "followers_count"            "1105"                                 
# [5,] "location"                   "San Diego, CA"                        
# [6,] "profile_background_color"   "9AE4E8"                               
# [7,] "listed_count"               "43"                                   
# [8,] "time_zone"                  "Pacific Time (US & Canada)"           
# [9,] "protected"                  "False"                            

Итак, теперь у вас есть имена идентификаторов в левом столбце и значения в правом. Вероятно, было бы просто собрать json с этого момента, если это необходимо.

Кроме того, что касается json-ness, мы можем привести m к data.frame (или оставить его как матрицу), а затем использовать jsonlite::toJSON

library(jsonlite)
json <- toJSON(setNames(as.data.frame(m), c("ID", "Value")))
fromJSON(json)
#                           ID                                 Value
# 1                         id                              19847005
# 2 profile_sidebar_fill_color http://pbs.foo.com/profile_background
# 3         profile_text_color                                333333
# 4            followers_count                                  1105
# 5                   location                         San Diego, CA
# 6   profile_background_color                                9AE4E8
# 7               listed_count                                    43
# 8                  time_zone            Pacific Time (US & Canada)
# 9                  protected                                 False
person Rich Scriven    schedule 30.12.2014