r - 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
解决方案
您可以使用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")
推荐阅读
- angular - 在调整窗口大小之前,我无法正确显示 openlayer 地图
- javascript - 如何将存储字符串 ID 的变量设置为 jQuery 元素以便可以使用 .offset() 函数?
- pandas - pandas groupby 并表示某列是否有某个值
- scala - 在递归函数情况下,不执行 nil
- c# - C#中的日期时间格式用法
- javascript - 如何从 422 Unprocessable Entity 响应中获取错误消息?
- node.js - How to scrape website which is dynamically rendered with filters?
- r - renderDataTable 中单元格的条件格式
- javascript - Angular忽略证书签名
- tensorflow - 变分自动编码器无法使用小输入值进行训练