Создание графика частоты конкретного слова c из кадра данных за период времени в R - PullRequest
0 голосов
/ 22 января 2020

У меня есть фрейм данных твитов в R, похожий на этот:

  tweet_text                                              tweet_time          rdate        twt
  <chr>                                                   <dttm>              <date>     <dbl>
1 No New England cottage is complete without nautical t.. 2016-08-25 09:21:00 2016-08-25     1
2 Justice Scalia spent his last hours with members of co… 2016-11-24 16:28:00 2016-11-24     1
3 WHAT THE FAILED OKLAHOMA ABORTION BILL TELLS US http:/… 2016-11-24 16:27:00 2016-11-24     1
4 Bipartisan bill in US Senate to restrict US arms sales… 2016-10-26 07:03:00 2016-10-26     1
5 #MustResign campaign is underway with the heat p his S… 2016-10-01 08:15:00 2016-10-01     1

Каждому твиту назначена определенная c дата, все твиты в фрейме данных имеют период в один год. Я хочу узнать частоту одного определенного c слова (например, "Сенат") за весь период и построить график, отражающий изменение частоты с течением времени. Я довольно новичок в R, и я мог думать только о сверхсложных способах сделать это, но я уверен, что должны быть некоторые, которые действительно просты и просты.

Я ценю любые предложения.

1 Ответ

0 голосов
/ 22 января 2020
textFreq <- function(pattern, text){
    freq <- gregexpr(pattern = pattern, text = text, ignore.case = TRUE)
    freq <- lapply(freq, FUN = function(x){
            if(length(x)==1&&x==-1){
                return(0)
            } else {
                return(length(x))
            }
        })
    freq <- unlist(freq)
    return(freq)
}

test.text <- c("senate.... SENate.. sen","Working in the senate...", "I like dogs")
textFreq(pattern = "senate", test.text)
# [1] 2 1 0

вы можете использовать dplyr для группировки по периодам времени и использовать mutate

library(dplyr)
library(magrittr)
data <- data %>% 
    group_by(*somedatefactor*) %>% #if you wanted to aggrigate every 10 days or something
    mutate(SenateFreqPerTweet = textFreq(pattern = "Senate", text = tweet_text),
           SenateFreqTotal = sum(SenateFreqPerTweet)) #Counts sum based on current grouping

Вы можете даже заключить предыдущее выражение в другую функцию. Для этого проверьте программирование с помощью dplyr

Но независимо от этого, используя этот подход, вы можете легко построить SenateFreqTotal с пакетом ggplot2

 data2 <- data %>% #may be helpful to reduce the size of the dataframe before plotting.
     select(SenateFreqTotal, *somedatefactor*) %>% 
     distinct()
 ggplot(data2, aes(y=SenateFreqTotal, x = *somedatefactor*)+ geom_bar(stat="identity")

, если вы не хотите агрегировать частоты, которые вы можете просто нарисовать так

ggplot(data, aes(y=SenateFreqPerTweet, x = tweet_time)) + 
    geom_bar(stat = "identity")
...