Existe-t-il une solution dans R pour générer des combinaisons uniques et leur fréquence?

Dec 09 2020

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

3 Duck Dec 09 2020 at 21:15

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())
3 RonakShah Dec 09 2020 at 21:25

Lorsque vous vous réduisez à toString sortl' 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
akrun Dec 10 2020 at 03:33

Dans base R, nous pouvons utiliser tableavecaggregate

table(aggregate(Food ~ CustomerID, 
   customerDataFrame[do.call(order, customerDataFrame),], FUN = toString)$Food)

#  Pizza Pizza, Tacos        Tacos 
#      1            2            1