Как посчитать вхождения каждого слова в столбце в R? - PullRequest
0 голосов
/ 19 января 2020

У меня есть набор данных анализа текста. Есть столбец, который показывает, распознается ли один из предопределенных терминов (показывает сам термин). выглядит примерно так (соответствующий столбец "funnel_term"):

выборка из моего набора данных

Я хочу посчитать, сколько раз каждый из терминов в " funnel_term "появляется. думал о для oop, но это не работает, как я хотел. вывод, который я ищу, будет примерно таким:

сексуальный - 6

расист - 4

плохо - 2

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 19 января 2020

Вы можете использовать grep() для этого. Пример с минимальным набором данных:

df <- data.frame(x = c("['Sexual']", "['Sexual']"))

length(grep("Sexual", df$x))

Или с более красивым выводом:

paste("Sexual - ", length(grep("Sexual", test$x)), sep="")

[1] "Sexual - 2"

Или с пакетом dplyr:

library(dplyr)

df <- data.frame(x = c("['Sexual']", "['Sexual']"))
df %>% dplyr::count(x)

Это не ' t для ячеек с двумя словами, например "['Sexual', 'Religion']". Итак, нам нужно это:

library(dplyr)

df <- data.frame(x = c("['Sexual', 'Religion']", "['Sexual']"))

df %>% mutate(x2 = strsplit(as.character(x), ",")) %>% 
  unnest(x2) %>% 
  mutate(x2 = str_replace_all(x2, "[^[:alnum:]]", "")) %>% 
  count(x2)
0 голосов
/ 21 января 2020

Я создал примерный набор данных, похожий на ваш, со следующим кодом:

sample <- tribble(~funnel_term, "['Sexual']", "['Islam', 'Religion']", "['Sexual', 'Islam']")

, который дает вам фрейм данных, который выглядит следующим образом:

  funnel_term          
  <chr>                
1 ['Sexual']           
2 ['Islam', 'Religion']
3 ['Sexual', 'Islam']  

Вы можете избавиться скобок и одинарных кавычек, а затем разделяют строки так, чтобы каждый элемент в списке становился своей собственной строкой

sample.1 <- sample %>% mutate(funnel_term_new = gsub("\\[|\\]|\'", "", funnel_term)) %>% separate_rows(funnel_term_new, sep = ", ")

, которая дает вам фрейм данных, который выглядит следующим образом:

  funnel_term           funnel_term_new
  <chr>                 <chr>          
1 ['Sexual']            Sexual         
2 ['Islam', 'Religion'] Islam          
3 ['Islam', 'Religion'] Religion       
4 ['Sexual', 'Islam']   Sexual         
5 ['Sexual', 'Islam']   Islam   

Теперь, когда у вас есть все термины воронки в их отдельной строке, вы можете использовать простые функции dplyr, чтобы получить счетчик каждого уникального funnel_term :

sample.final <- sample.1 %>% group_by(funnel_term_new) %>% summarise(n = n())
  funnel_term_new     n
  <chr>           <int>
1 Islam               2
2 Religion            1
3 Sexual              2
0 голосов
/ 19 января 2020

Хотите ли вы сосчитать несколько вхождений слов типа "racist" в строке? Если это так, вы можете проверить функцию gregexpr:

gregexpr("sexual", df$text)

. Она покажет вам начальные точки каждого из слов "racist" в вашем столбце. Чтобы подсчитать их все, вы можете сделать:

object_1 <- gregexpr("sexual", df$text)

for (i in seq_len(length(object_1))) {
  if (object_1[[i]] == -1) {
    object_1[[i]] <- NULL
  }
}

sum(sapply(object_1, function (x) {
  length(x)
}))

Если вы хотите найти слова, подобные "sexual", но не такие слова, как "asexual" или "sexually", вы должны использовать регулярные выражения. Используйте

gregexpr("\\bsexual\\b", df$text)

вместо

gregexpr("sexual", df$text)

Чтобы получить желаемый результат, вы должны сделать:

original_funnel_terms <- c("sexual", "racist", "ill")
funnel_terms <- paste0("\\b", funnel_terms, "\\b")
output_1 <- sapply(seq_len(length(funnel_terms)), function (z) {
  sum(sapply(sapply(gregexpr(funnel_terms[z], df$text), function (x) {
    if (x[1] == -1) {
      y <- NULL
    } else {
      y <- x
    }
    y
  }), length))
})
names(output_1) <- original_funnel_terms
output_2 <- paste(names(output), " - ", as.character(output), sep = "")
cat(output_2, sep = "\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...