Existe-t-il une solution dans R pour générer des combinaisons uniques et leur fréquence?
Voici mon code. J'essaie de générer toutes les combinaisons non répétitives de la colonne Food et combien de fois elle apparaît compte tenu de la colonne ID.
customerDataFrame <- data.frame(CustomerID = c('A', 'B', 'B', 'C', 'D', 'D'),
Food = c('Pizza', 'Pizza', 'Tacos', 'Tacos', 'Tacos', 'Pizza'))
customerDataFrame %>%
group_by(CustomerID) %>%
summarise_all(funs(toString(unique(.)))) %>%
ungroup() %>%
group_by(Food) %>%
summarise(n= n())
Voici la sortie en ce moment:
# A tibble: 4 x 2
Food n
<chr> <int>
1 Pizza 1
2 Pizza, Tacos 1
3 Tacos 1
4 Tacos, Pizza 1
Ceci est techniquement incorrect car les clients qui achètent (Pizza, Tacos) et (Tacos, Pizza) doivent être dans le même groupe. Peu importe la commande dans laquelle ils achètent.
(J'ai obtenu le code de cette réponse: Utilisation de dplyr pour créer un vecteur de combinaisons uniques de valeurs pour un groupe donné )
Voici ce que j'essaye d'obtenir:
# A tibble: 4 x 2
Food n
<chr> <int>
1 Pizza 1
2 Pizza, Tacos 2
3 Tacos 1
Réponses
Essaye ça. Vous pouvez doubler summarise()
pour obtenir le résultat attendu:
library(dplyr)
#Code
new <- customerDataFrame %>%
arrange(CustomerID,Food)%>%
group_by(CustomerID) %>%
summarise(Food=paste0(Food,collapse = ',')) %>%
group_by(Food,.drop = T) %>%
summarise(N=n())
Production:
# A tibble: 3 x 2
Food N
<chr> <int>
1 Pizza 1
2 Pizza,Tacos 2
3 Tacos 1
La même sortie peut être atteinte en utilisant toString()
:
#Code 2
new <- customerDataFrame %>%
arrange(CustomerID,Food)%>%
group_by(CustomerID) %>%
summarise(Food=toString(Food)) %>%
group_by(Food,.drop = T) %>%
summarise(N=n())
Lorsque vous vous réduisez à toString
sort
l' aide de Food
.
library(dplyr)
customerDataFrame %>%
group_by(CustomerID) %>%
summarise(Food = toString(sort(Food))) %>%
count(Food)
# Food n
# <chr> <int>
#1 Pizza 1
#2 Pizza, Tacos 2
#3 Tacos 1
Dans base R
, nous pouvons utiliser table
avecaggregate
table(aggregate(Food ~ CustomerID,
customerDataFrame[do.call(order, customerDataFrame),], FUN = toString)$Food)
# Pizza Pizza, Tacos Tacos
# 1 2 1