首页 > 解决方案 > group_by grepl 表达式 dplyr R

问题描述

我想找到一种有效的 group_by 方法(和优雅的代码),其中组由正则表达式找到,该正则表达式将在文本向量(推文)中运行。可能会有多次显示的推文,但这不是问题,因为我只想计算候选人被引用的次数。

下面的代码实际上可以工作,但我希望代码能够识别正则表达式并按它进行分组,我已经尝试过str_count但没有取得太大成就。

##Data example:
library('dplyr')
all.t <- data.frame(text =  c("@dottore_marcelo @LorranParadiso @1pedroOsilva @Ronaldocampos00 @jairbolsonaro Mas quem disse que @jairbolsonaro vai resolver todos os problemas do país tem 4 anos? Ele é um ponto de inflexão, quem sabe depois de 8 anos elegeremos um rocha ou um Amoedo, pois a estrada já estará pavimentada. Vamos pensar que no longo prazo a disputa será entre liber e conser",
                              "@Ideias_Radicais Opiniao sobre a Marina Silva? Geraldo Alckmin? vai fazer oq se eles ganhar as eleiçoes?",                                                                                                                                                                          
                              "@pkogos E se a Marina Silva ou o Ciro gomes ganhar?",
                              "@pkogos A França está dominada pela mentalidade esquerdista ! Se a Marina Silva ou o Ciro Ganhar vai acontecer o mesmo" ,                                                                                                                                                                                                                                                
                              "@cirogomes @guilhermefpenna @geraldoalckmin @MarinaSilva @jairbolsonaro @alvarodias_ Passo. Próximo.",                                                                                                                                                                                                                                                                   
                              "@joaopedro27696 @marx_araujo @folha 1) Não sou robô; 2) É \"Amoêdo\" e não \"Amoado\"; 3) Não voto com base em pesquisa, e sim em ideias, currículo e histórico... @jairbolsonaro é populista"),
                    stringsAsFactors = FALSE
)

##regex I want to group_by 
candidatos <- c('bolsonaro|@jairbolsonaro',
                'amoedo|@joaoamoedonovo',
                'marina silva|@marinasilva')

## this is the part I want to improve
bind_rows(
all.t %>% filter(grepl(candidatos[1], text, ignore.case = TRUE)) %>% 
count() %>% mutate(candidato = 'Bolsonaro')

all.t %>% filter(grepl(candidatos[2], text, ignore.case = TRUE)) %>% 
count() %>% mutate(candidato = 'Marina Silva')

all.t %>% filter(grepl(candidatos[3], text, ignore.case = TRUE)) %>%
 count() %>% mutate(candidato = 'João Amoêdo')
)          

我得到的输出正是我想要的,但是如果我添加了太多的类,那么每个类都会很痛苦。

       n candidato       
   <int> <chr>      
 1   3  Bolsonaro
 2   1  Marina Silva
 3   4  João Amoêdo

标签: rgroup-bycountdplyr

解决方案


您可以使用map迭代每个正则表达式。您需要提供正则表达式,但只需要一份代码副本即可计算值。如果您提供正则表达式的命名向量,那么您还可以轻松地用实际的候选名称代替输出中的正则表达式(或者,如果您想要记录正则表达式,则可以在输出中包含两者用于每个候选人):

library(tidyverse)

##regex I want to group_by 
candidatos <- c(Bolsonaro='bolsonaro|@jairbolsonaro',
                "João Amoêdo"='amoedo|@joaoamoedonovo',
                "Marina Silva"='marina silva|@marinasilva')

map_df(candidatos, 
       ~ dat %>% 
           filter(grepl(.x, text, ignore.case=TRUE)) %>% 
           count(), 
       .id="Candidato")
  Candidato        n
  <chr>        <int>
1 Bolsonaro        3
2 João Amoêdo      1
3 Marina Silva     4

要将正则表达式保留在输出中:

map_df(candidatos, 
       ~ dat %>% 
           filter(grepl(.x, text, ignore.case=TRUE)) %>% 
           mutate(regex=.x) %>% 
           count(regex), 
       .id="Candidato")

计数也可以在没有的情况下完成filter

map_df(candidatos, 
       ~ dat %>% 
           summarise(regex=.x,
                     n=sum(grepl(.x, text, ignore.case = TRUE))), 
       .id="Candidato")

推荐阅读