Регулярное выражение для извлечения всего текста после "- !!" в р дплыр - PullRequest
2 голосов
/ 30 апреля 2020

Я пытаюсь использовать dplyr в R для извлечения подстрок после строки переменной в кадре данных, отфильтрованной определенными экземплярами переменной name в примере ниже. Я пытаюсь передать желаемый результат в новую переменную с именем income_rent.

Я новичок в регулярных выражениях. Моя попытка сделать это:

income_cashrent <- v18 %>% 
filter(str_detect(name, "B25122")) %>% 
mutate(income_rent = str_extract(label, "[^--!!]*$"))

Однако я получаю результат: Error in stri_extract_first_regex(string, pattern, opts_regex = opts(pattern)) : Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)

Первые четыре строки name:

Estimate!!Total
Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000
Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent
Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent!!Less than $100

Желаемый результат будет:

[not sure how to indicate an empty result here]
Less than $10,000
Less than $10,000!!With cash rent
Less than $10,000!!With cash rent!!Less than $100

До сих пор я был не в состоянии отладить это, просматривая другие примеры регулярных выражений в стеке. Любое руководство будет приветствоваться. Спасибо всем заранее!

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020
regmatches(vec, gregexpr("(?<=--!!).*", vec, perl = TRUE))
# [[1]]
# character(0)
# [[2]]
# [1] "Less than $10,000"
# [[3]]
# [1] "Less than $10,000!!With cash rent"
# [[4]]
# [1] "Less than $10,000!!With cash rent!!Less than $100"

Если вы unlist отсюда, вы заметите, что «проиграли» первую запись, не будучи уверенным, что это проблема.

unlist(regmatches(vec, gregexpr("(?<=--!!).*", vec, perl = TRUE)))
# [1] "Less than $10,000"                                
# [2] "Less than $10,000!!With cash rent"                
# [3] "Less than $10,000!!With cash rent!!Less than $100"

Если это проблема, то

vecout <- regmatches(vec, gregexpr("(?<=--!!).*", vec, perl = TRUE))
unlist(replace(vecout, lengths(vecout) < 1, NA))
# [1] NA                                                 
# [2] "Less than $10,000"                                
# [3] "Less than $10,000!!With cash rent"                
# [4] "Less than $10,000!!With cash rent!!Less than $100"

(или вы также можете заменить на "".)


В dplyr конвейер:

tibble(vec = c("Estimate!!Total",
# "Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000",
# "Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent",
# "Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent!!Less than $100")) %>%
  mutate(out = regmatches(vec, gregexpr("(?<=--!!).*", vec, perl = TRUE)), out = replace(out, lengths(vecout) < 1, NA), out = unlist(out))
+ + # A tibble: 4 x 2
#   vec                                             out                           
#   <chr>                                           <chr>                         
# 1 Estimate!!Total                                 <NA>                          
# 2 Estimate!!Total!!Household income in the past ~ Less than $10,000             
# 3 Estimate!!Total!!Household income in the past ~ Less than $10,000!!With cash ~
# 4 Estimate!!Total!!Household income in the past ~ Less than $10,000!!With cash ~

Данные:

vec <- c("Estimate!!Total",
"Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000",
"Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent",
"Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent!!Less than $100")
2 голосов
/ 30 апреля 2020

Мы можем использовать str_extract to extract the characters after the pattern - !! `, используя регулярное выражение lookaround

library(stringr)
library(dplyr)
 v18 %>%        
     mutate(income_rent = str_extract(label, "(?<=--!!).*"))                                                                                                                                                label
#1                                                                                                                                    Estimate!!Total
#2                                 Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000
#3                 Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent
#4 Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent!!Less than $100
 #                                       income_rent
#1                                              <NA>
#2                                 Less than $10,000
#3                 Less than $10,000!!With cash rent
#4 Less than $10,000!!With cash rent!!Less than $100

Или другой вариант str_match

v18$income_rent <-  str_match(v18$label, ".*--!!(.*)")[,2]

data

v18 <- structure(list(label = c("Estimate!!Total", "Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000", 
"Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent", 
"Estimate!!Total!!Household income in the past 12 months (in 2018 inflation-adjusted dollars) --!!Less than $10,000!!With cash rent!!Less than $100"
)), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...