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"))
3 Réponses :
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
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.
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
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
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