1
votes

Fréquence entre les couples de mots

Avoir un bloc de données comme celui-ci:

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

Comment est-il possible d'extraire une table comme

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

et de cette table trouver les couples les plus fréquents?

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

r

0 commentaires

3 Réponses :


2
votes

La première partie peut être réalisée en utilisant lignes_séparées , count et spread

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

Pour la deuxième partie, j'ai utilisé une méthode de base R où nous avons d'abord fractionné mots-clés basés sur une combinaison id , paste tous les 2 éléments et compter leur fréquence en utilisant table .

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


4 commentaires

Je suis tout à fait d'accord, mais est-ce qu'ils ont une poignée spéciale si un mot-clé a deux parties, à savoir «amazon stock, google, yahoo», c'est-à-dire «amazon stock», le code sépare amazon et stock séparément et je voudrais l'avoir comme un mot. Est-il possible?


@ElrMant oui, vous pouvez ajouter un séparateur dans separ_rows . df%>% separ_rows (keywords, sep = ",") donc il se sépare en différentes lignes uniquement en fonction de la virgule et rien d'autre. Ici, dans l'exemple comme chaque mot-clé n'avait qu'un seul mot, je n'ai donc pas explicitement ajouté l'argument sep .


Merci. Ça marche. Mais y a-t-il une poignée spéciale pour la deuxième partie du couple de fréquences?


Je ne sais pas ce que vous entendez par «poignée spéciale». Si vous voulez dire une manière différente, je vous ai montré une manière et une autre est montrée par tmfmnk.



2
votes

Une possibilité tidyverse pourrait être:

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)

Il divise d'abord la colonne "mots-clés" sur , puis effectue un se joindre à lui-même. Deuxièmement, il filtre les lignes où les valeurs sont les mêmes que l'OP s'intéresse aux paires de valeurs. Troisièmement, il compte le nombre d'occurrences de paires. Enfin, il crée une variable ordonnée de paires et ne conserve que les lignes distinctes en fonction de cette variable.

Ou la même chose en utilisant separate_rows():

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


0 commentaires

1
votes

Nous pouvons le faire facilement avec

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


2 commentaires

et de ce tableau comment est-il possible d'extraire les paires les plus fréquentes?


@ElrMant Vous pouvez faire combn de 2 paires et sélectionner les paires avec les plus fréquentes, coller leurs noms