首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式过滤器的匿名函数

正则表达式过滤器的匿名函数
EN

Stack Overflow用户
提问于 2020-01-17 09:53:52
回答 1查看 84关注 0票数 0

我有一个filter()函数,它在tibble中过滤特定的Regex。因为我需要这样做不止一次,所以我想编写一个as_mapper()函数,最后得到更短的代码。我该怎么做?

我尝试了以下几点:

代码语言:javascript
复制
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)

如果我试图将这个函数添加到tibble中,R会抛出一个C stack usage x is too close to the limit错误。我怎么才能避免这种情况?

可以使用以下代码生成我想要检查的tibble之一:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-17 10:44:27

编辑以获得较短的代码

您可以编写一个不依赖于as_mapper的简单单行函数:

代码语言:javascript
复制
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")

这将只返回未找到regex的df行。

我不认为您需要在这里使用映射器,您可以简单地构建一个正常的函数,它将接受一个tibble、一个目标regex作为输入,并通过一个提供grepl结果的新增列来返回该数据。一种可能是:

代码语言:javascript
复制
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  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59784948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档