Подсчитайте количество слов, общее количество слов и общее количество уникальных слов в R

У меня есть огромный df, в котором есть doc_id и word, и каждый word может содержать несколько class(Class_1,Class_2,Class_3 ), поэтому, если слово есть в этом class, я помещаю туда 1, а если нет, то 0

ОБРАЗЕЦ DF

doc_id   word       Class_1   Class_2   Class_3 
104      saturn       1         0         1
104      survival     1         1         0
104      saturn       1         0         1
104      car          0         1         0  
118      baseball     1         1         0
118      color        0         0         1
118      muscle       0         1         0
187      image        1         0         0
187      pulled       0         0         0
187      game         1         0         1
187      play         0         0         1 
187      game         1         1         0 
125      translation  1         0         0  
125      survival     0         1         0
125      input        1         0         1      
125      excellent    1         0         0 
142      nice         0         1         0
142      article      0         1         0 
142      original     1         0         1
142      content      0         1         0

Теперь, используя это sample DF, я хочу count количество вхождений word в class(Class_1,Class_2,Class_3).
Всего слов в каждом class(Class_1,Class_2,Class_3), eg: например, сколько words есть в Class_1
и, наконец, всего unique words во всех документах.

OUTPUT DF должен выглядеть примерно так

doc_id   word       Occ_1  Occ_2  Occ_3  Totl_1  Totl_2  Totl_3  Unique_words 
104      saturn       2      0      2      11     9       7       17
104      survival     1      2      0      11     9       7       17
104      car          0      1      0      11     9       7       17
118      baseball     1      1      0      11     9       7       17
118      color        0      0      1      11     9       7       17
118      muscle       0      1      0      11     9       7       17
187      image        1      0      0      11     9       7       17
187      pulled       0      0      0      11     9       7       17  
187      game         2      1      1      11     9       7       17
187      play         0      0      1      11     9       7       17
125      translation  1      0      0      11     9       7       17 
125      input        1      0      1      11     9       7       17
125      excellent    1      0      0      11     9       7       17
142      nice         0      1      0      11     9       7       17
142      article      0      1      0      11     9       7       17 
142      original     1      0      1      11     9       7       17
142      content      0      1      0      11     9       7       17

Принимая во внимание, что
Occ_1 = количество вхождений слова в Class_1 и то же самое для других Class_2и Class_3
Totl_1 = общее количество слов в Class_1 и то же самое для других Class_2и Class_3
Unique_words = общее количество уникальных Слова во всех документах


person james joyce    schedule 10.01.2019    source источник


Ответы (2)


Используя dplyr, вы можете запустить следующие строки:

library(dplyr)

data %>%
  group_by(word) %>%
  summarise(
    doc_id = first(doc_id),
    Occ_1 = sum(Class_1),
    Occ_2 = sum(Class_2),
    Occ_3 = sum(Class_3)
  ) %>%
  arrange(doc_id, word) %>%
  mutate(
    Totl_1 = sum(Occ_1),
    Totl_2 = sum(Occ_2),
    Totl_3 = sum(Occ_3),
    Unique_words = n()
  )

Вывод

   word        doc_id Occ_1 Occ_2 Occ_3 Totl_1 Totl_2 Totl_3 Unique_words
   <chr>       <chr>  <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>        <int>
 1 car         104        0     1     0     11      9      7           17
 2 saturn      104        2     0     2     11      9      7           17
 3 survival    104        1     2     0     11      9      7           17
 4 baseball    118        1     1     0     11      9      7           17
 5 color       118        0     0     1     11      9      7           17
 6 muscle      118        0     1     0     11      9      7           17
 7 excellent   125        1     0     0     11      9      7           17
 8 input       125        1     0     1     11      9      7           17
 9 translation 125        1     0     0     11      9      7           17
10 article     142        0     1     0     11      9      7           17
11 content     142        0     1     0     11      9      7           17
12 nice        142        0     1     0     11      9      7           17
13 original    142        1     0     1     11      9      7           17
14 game        187        2     1     1     11      9      7           17
15 image       187        1     0     0     11      9      7           17
16 play        187        0     0     1     11      9      7           17
17 pulled      187        0     0     0     11      9      7           17

Я добавил функцию arrange для сортировки набора данных по doc_id и word, иначе выходной набор данных был бы отсортирован в алфавитном порядке по word.

person Ric S    schedule 10.01.2019
comment
Хорошо, я попробую найти другое решение - person Ric S; 10.01.2019
comment
@jamesjoyce Я добавил пару строк в код, теперь он должен работать так, как вы хотели. - person Ric S; 10.01.2019

Установите эти пакеты:

necessary_packages <-
  c("dplyr", "tiydr")
new_packages <-
  necessary_packages[!(necessary_packages %in% installed.packages()[, "Package"])]
if (length(new_packages) > 0) {
  install.packages(new_packages, dependencies = TRUE)
}
lapply(necessary_packages, require, character.only = TRUE)

Теперь давайте посчитаем слова и изменим форму вашего df:

df <- 
df %>%
gather("class", "n", 3:6) %>%
group_by(word, class) %>%
mutate(occ = sum(n)) %>%
ungroup() %>%
group_by(class) %>%
mutate(class_totl = sum(n)) %>%
ungroup() %>% 
mutate(Unique_words = sum(n)) %>%
select(doc_id, word, occ, class_total, Unique_words) %>%
gather(variable, value, 3:6) %>%
spread(variable, value)

Примечание. Я не запускал приведенный выше код, потому что вы не предоставили код для создания файла df.

person hello_friend    schedule 10.01.2019
comment
Ошибка в inds_combine(.vars, ind_list): позиция должна быть между 0 и n - person james joyce; 10.01.2019
comment
##заменить строку; собрать(переменная, значение, 3:6) %›% TO собрать(переменная, значение, 3:5) %›% - person hello_friend; 11.01.2019
comment
все еще не работает..Спасибо за ваше время..@Ric S был отмечен - person james joyce; 11.01.2019