Извлечение регулярных выражений в R

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

Я пытаюсь использовать регулярное выражение в R с помощью пакета stringr для извлечения имен политиков из моего вектора «имена», вектор имен содержит некоторые нестандартные символы. Моя цель - извлечь фамилию и символы в квадратных скобках. Есть 3 разных способа, которыми выглядят имена, и они ниже:

  • Сенатор Майк Ли [R]
  • Сенатор Крис Кунс [D, 2010-2020]
  • Сенатор Чарльз «Чак» Грассли [справа]

Из пакета stringr я запускаю этот код:

str_extract("\\w+\\s\\[.+\\]$", names)  # names is the vector of names

Я получаю эту ошибку:

Error in UseMethod("type") : 
  no applicable method for 'type' applied to an object of class "NULL"

Я пытаюсь диагностировать эту ошибку, но не могу найти ничего в Интернете, чтобы помочь.


person user2962887    schedule 29.02.2016    source источник
comment
сначала преобразуйте свои имена в символы с помощью df$colname<-as.character(df$colname)   -  person CuriousBeing    schedule 29.02.2016
comment
Во-первых, вы перепутали порядок аргументов в str_replace: он должен быть str_extract(names, "\\w+\\s\\[.+\\]$"). Во-вторых, вы получите [1] "Lee [R]" "Coons [D, 2010-2020]" "Grassley [R]". В-третьих, какой результат вы ожидаете?   -  person Wiktor Stribiżew    schedule 29.02.2016
comment
Результат, который вы опубликовали, - это то, что я ожидаю, с этими элементами для каждого элемента моего вектора.   -  person user2962887    schedule 29.02.2016
comment
Спасибо, теперь я чувствую себя глупо, так как я смешивал документацию stringr и другую документацию о функциях r regex. Это решило мою проблему. Спасибо.   -  person user2962887    schedule 29.02.2016
comment
Я разместил свой комментарий с более подробной информацией в качестве ответа. Пожалуйста, используйте @ + имя пользователя при написании комментария, иначе пользователь не получит уведомление.   -  person Wiktor Stribiżew    schedule 29.02.2016


Ответы (2)


Вы перепутали порядок аргументов в str_replace: он должен быть str_extract(names, "\\w+\\s\\[.+\\]$") (то есть names должен быть первым аргументом, а регулярное выражение должно быть вторым аргументом. Вы получите

> str_extract(names, "\\w+\\s\\[.+\\]$")
[1] "Lee [R]"              "Coons [D, 2010-2020]" "Grassley [R]" 

Обратите внимание, что вы можете удалить экранирующий символ из ], поскольку он не является специальным метасимволом регулярного выражения, и вы можете заменить .+ классом отрицательных символов [^][]+, чтобы он соответствовал любому одному или нескольким символам, кроме ] и [:

> str_extract(names, "\\w+\\s\\[[^\\]\\[]+]$")
[1] "Lee [R]"              "Coons [D, 2010-2020]" "Grassley [R]"  
person Wiktor Stribiżew    schedule 29.02.2016

Данный

names <- c("Sen. Mike Lee [R]", "Sen. Chris Coons [D, 2010-2020]", "Sen. Charles “Chuck†Grassley [R]")
stringr::str_extract("\\w+\\s\\[.+\\]$", names)  # names is the vector of names
# [1] NA NA NA

и

t(sapply(regmatches(names, regexec(".*\\s(\\w+)\\s\\[(.+)\\]", names)), "[", -1))
#      [,1]       [,2]          
# [1,] "Lee"      "R"           
# [2,] "Coons"    "D, 2010-2020"
# [3,] "Grassley" "R"  

Я не могу воспроизвести вашу ошибку.

person lukeA    schedule 29.02.2016
comment
Спасибо, это работает в консоли RStudio, но я почему-то не могу заставить его работать в моем скрипте. - person user2962887; 29.02.2016
comment
Проблемы с кодировкой? Вы всегда должны предоставлять воспроизводимый пример для копирования-вставки-запуска. - person lukeA; 29.02.2016
comment
Я сделаю это в будущем, моя ошибка возникла из-за того, что я перепутал порядок аргументов в str_extract, как указано в комментариях выше. Спасибо - person user2962887; 29.02.2016