Анонимная функция для фильтра регулярных выражений - PullRequest
0 голосов
/ 17 января 2020

У меня есть функция filter(), которая фильтрует для указания c Regex в таблице. Поскольку мне нужно делать это более одного раза, я хочу написать функцию as_mapper(), чтобы в итоге получить более короткий код. Как я могу это сделать?

Я попробовал следующее:

adverts <- as_mapper(~!grepl("(xtm)|((k|K)(i|I|1|11)(d|D)(n|N).)|(Ar<e)\\s(you)\\s(in)| 
  (LOAN)|(AR(\\s|\\S)[0-9])|((B|b)(i|1|l)tc.)|(Coupon)|(Plastic.King)|(organs)|(SILI)|(Electric.Cigarette.Machine)",.$value,perl = T)%>% filter)

Если я попытаюсь добавить эту функцию в таблицу, R выдаст мне ошибку C stack usage x is too close to the limit. Как я могу избежать этого?

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

library(tidyverse)
library(rvest)
library(textreadr)

bribe <- read_html(paste("http://ipaidabribe.com/reports/paid?page", 10, sep = "="))
all.nodes <- c(".heading-3 a",".paid-amount span", ".date", ".location", ".transaction a")
test <- map(all.nodes, ~ html_nodes(bribe, .x) %>% html_text()) %>% 
  unlist %>% 
  as_tibble
adverts(test)

1 Ответ

1 голос
/ 17 января 2020

РЕДАКТИРОВАТЬ для более короткого кода

Вы можете написать простую однострочную функцию, которая не полагается на as_mapper:

target_regex <- "(xtm)|((k|K)(i|I|1|11)(d|D)(n|N).)|(Ar<e)\\s(you)\\s(in)| 
(LOAN)|(AR(\\s|\\S)[0-9])|((B|b)(i|1|l)tc.)|(Coupon)|(Plastic.King)|(organs)|(SILI)|(Electric.Cigarette.Machine)"
adverts <- function(df, col) df[!grepl(target_regex, df[[col]],perl = T), ]
test_df %>% adverts(col = "value")

Это вернет только строки df, для которых не найдено регулярное выражение целевое регулярное выражение и вернуть этот столбец с добавленным столбцом, дающим результат grepl. Одна из возможностей:

filter_regex <- function(df, regex, col){
    df %>% 
        mutate(found = grepl(pattern = regex, x = df[[col]])) %>% 
        filter(found == TRUE) %>% 
        select(-found)
}
test_df <- map(all.nodes, ~ html_nodes(bribe, .x) %>% html_text()) %>%
    unlist %>% 
    as_tibble
target_regex <- "(xtm)|((k|K)(i|I|1|11)(d|D)(n|N).)|(Ar<e)\\s(you)\\s(in)| 
(LOAN)|(AR(\\s|\\S)[0-9])|((B|b)(i|1|l)tc.)|(Coupon)|(Plastic.King)|(organs)|(SILI)|(Electric.Cigarette.Machine)"

filter_regex(test_df, target_regex, "value")

> # A tibble: 7 x 1
>  value                                                                                      
>  <chr>                                                                                      
> 1 "\r\n                      Kidney Donor Needed Urgently Needed\r\n                    "    
> 2 "\r\n                      Kidney Donor Needed Urgetly \r\n                    "           
> 3 "\r\n                      Urgent Kidney Donor Needed\r\n                    "             
> 4 "\r\n                      Urgent Kidney Donor Needed\r\n                    "             
> 5 "\r\n                      Kidney Donor Needed\r\n                    "                    
> 6 "\r\n                      Kidney Donor Needed\r\n                    "                    
> 7 "\r\n                      Kidney donation urgently needed in India for 7 CR\r\n  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...