Частота между парами слов - PullRequest
1 голос
/ 10 мая 2019

Имея такой фрейм данных:

df <- data.frame(id = c(1,2,3,4,5), keywords = c("google, yahoo, air, cookie", "cookie, air", "air, cookie", "google", "yahoo, google"))

Как можно извлечь таблицу типа

df_binary_exist <- data.frame(id = c(1,2,3,4,5), google = c(1,0,0,1,1), yahoo = c(1,0,0,0,1), air = c(1,1,1,0,0), cookie = c(1,1,1,0,0))
df_binary_exist
  id google yahoo air cookie
1  1      1     1   1      1
2  2      0     0   1      1
3  3      0     0   1      1
4  4      1     0   0      0
5  5      1     1   0      0

и найти из этой таблицы наиболее часто встречающиеся пары?

df_frequency <- data.frame(couple = c("yahoo-google", "cookie-air"), freq = c(2,3))
df_frequency
        couple freq
1 yahoo-google    2
2   cookie-air    3

Ответы [ 3 ]

2 голосов
/ 10 мая 2019

Одна tidyverse возможность может быть:

df %>%
 mutate(keywords = strsplit(keywords, ", ", fixed = TRUE)) %>%
 unnest() %>%
 full_join(df %>%
            mutate(keywords = strsplit(keywords, ", ", fixed = TRUE)) %>%
            unnest(), by = c("id" = "id")) %>%
 filter(keywords.x != keywords.y) %>%
 count(keywords.x, keywords.y) %>%
 transmute(keywords = paste(pmax(keywords.x, keywords.y), pmin(keywords.x, keywords.y), sep = "-"),
           n) %>%
 distinct(keywords, .keep_all = TRUE)

  keywords          n
  <chr>         <int>
1 cookie-air        3
2 google-air        1
3 yahoo-air         1
4 google-cookie     1
5 yahoo-cookie      1
6 yahoo-google      2

Сначала разбивает столбец "ключевые слова" на ,, а затем выполняет полное соединение с самим собой.Во-вторых, он отфильтровывает строки, значения которых совпадают с интересующими OP парами значений.В-третьих, он подсчитывает количество вхождений пар.Наконец, он создает упорядоченную переменную пар и сохраняет только отдельные строки на основе этой переменной.

Или то же самое, используя separate_rows():

df %>%
 separate_rows(keywords) %>%
 full_join(df %>%
            separate_rows(keywords), by = c("id" = "id")) %>%
 filter(keywords.x != keywords.y) %>%
 count(keywords.x, keywords.y) %>%
 transmute(keywords = paste(pmax(keywords.x, keywords.y), pmin(keywords.x, keywords.y), sep = "-"),
           n) %>%
 distinct(keywords, .keep_all = TRUE)
2 голосов
/ 10 мая 2019

Первая часть может быть достигнута с помощью separate_rows, count и spread

library(dplyr)
library(tidyr)

df1 <- df %>% separate_rows(keywords)

df1 %>%
  dplyr::count(id, keywords) %>%
  spread(keywords, n, fill = 0)

#     id   air cookie google yahoo
#   <dbl> <dbl>  <dbl>  <dbl> <dbl>
#1     1     1      1      1     1
#2     2     1      1      0     0
#3     3     1      1      0     0
#4     4     0      0      1     0
#5     5     0      0      1     1

Для второй части я использовал метод base R, где мы сначала split keywords основаны на комбинации id, paste каждых 2 элементов и считаем их частоту, используя table.

data.frame(sort(table(unlist(sapply(split(df1$keywords, df1$id), function(x) 
   combn(sort(x), pmin(2, length(x)), paste, collapse = "-")))), decreasing = TRUE))

#           Var1 Freq
#1    air-cookie    3
#2  google-yahoo    2
#3    air-google    1
#4     air-yahoo    1
#5 cookie-google    1
#6  cookie-yahoo    1
#7        google    1
1 голос
/ 10 мая 2019

Мы можем сделать это легко с

library(qdapTools)
cbind(df[1],  mtabulate(strsplit(as.character(df$keywords), ", ")))
#  id air cookie google yahoo
#1  1   1      1      1     1
#2  2   1      1      0     0
#3  3   1      1      0     0
#4  4   0      0      1     0
#5  5   0      0      1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...