Grepl группа строк и частота подсчета всех с использованием R

#r #count #grepl

#r #граф #grepl

Вопрос:

У меня есть столбец из 50 тысяч строк твитов с именем text из CSV-файла (твиты состоят из предложений, фраз и т.д.). Я пытаюсь подсчитать частоту нескольких слов в этой колонке. Есть ли более простой способ сделать это по сравнению с тем, что я делаю ниже?

 # Reading my file
tweets <- read.csv('coffee.csv', header=TRUE)


# Doing a grepl per word (This is hard because I need to look for many words one by one)
coffee    <- grepl("coffee", text$tweets, ignore.case=TRUE)
mugs    <- grepl("mugs", text$tweets, ignore.case=TRUE)


# Calculate the % of times among all tweets (This is hard because I need to calculate one by one)

sum(coffee) / nrow(text)
sum(starbucks) / nrow(text)
 

Ожидаемый результат (при условии, что у меня там больше 2 слов)

 Word   Freq
coffee  50
mugs    40
cup     64
pen     12
 

Ответ №1:

Вы можете создать вектор слов, для которых вы хотите подсчитать частоту / процент, и использовать sapply их для их вычисления.

 words <- c('coffee', 'mugs')

data.frame(words, t(sapply(paste0('\b', words, '\b'), function(x) {
  tmp <- grepl(x, tweets$text)
  c(perc = mean(tmp) * 100, 
    Freq = sum(tmp))
})), row.names = NULL) -> result
result

#   words     perc Freq
#1 coffee 33.33333    1
#2   mugs 66.66667    2
 

sapply аналогично for циклу, поскольку он перебирает каждое слово, определенное в words . grepl возвращает TRUE / FALSE значения, указывающие, присутствует ли слово, в tweets$text котором хранится tmp . Для подсчета частоты, которую мы используем sum , и для процента, который мы используем mean . Также добавлена граница слова ( \b ) к словам, чтобы они полностью совпадали в text , следовательно 'coffee' , не совпадают с 'coffees' etc.

данные

 tweets <- data.frame(text = c('This is text with coffee in it with lot of mugs', 
                              'This has only mugs', 
                              'This has nothing'))
 

Комментарии:

1. ПРИВЕТ, Ронак! Что касается получения данных, у меня есть 50 тыс. твитов, и я не думаю, что перевод их в вектор c будет работать. Как мне импортировать его из Tweets.csv? (Имя столбца: текст)

2. Вам не нужно помещать данные по одному в вектор. У вас уже есть данные tweets <- read.csv('coffee.csv', header=TRUE) . Вам нужно поместить в вектор слова, для которых вы хотите подсчитать частоту. words <- c('coffee', 'mugs', 'cup', 'pen')

3. Спасибо, что работает! Можете ли вы объяснить, что такое строки кода в: data.frame ? Например, что делает sapply и tmp?

4. Я добавил некоторое объяснение кода в ответ. Надеюсь, это поможет.

5. Извините, последний вопрос, что, если у меня есть примерно 2 слова, но я хочу посчитать их как одно, например: «кофе со льдом»? Будет ли это работать, нужно ли мне создавать gsub?