Gibt es in R eine Lösung, um eindeutige Kombinationen und deren Häufigkeit zu generieren?

Dec 09 2020

Hier ist mein Code. Ich versuche, alle sich nicht wiederholenden Kombinationen der Spalte "Lebensmittel" zu generieren und wie oft sie in der Spalte "ID" angezeigt werden.


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())

Hier ist die Ausgabe im Moment:

# A tibble: 4 x 2
  Food             n
  <chr>        <int>
1 Pizza            1
2 Pizza, Tacos     1
3 Tacos            1
4 Tacos, Pizza     1

Dies ist technisch nicht korrekt, da die Kunden, die (Pizza, Tacos) und (Tacos, Pizza) kaufen, zur selben Gruppe gehören sollten. Es spielt keine Rolle, in welcher Reihenfolge sie kaufen.

(Ich habe den Code aus dieser Antwort erhalten: Verwenden von dplyr, um einen Vektor eindeutiger Wertekombinationen für eine bestimmte Gruppe zu erstellen. )

Folgendes versuche ich zu bekommen:

# A tibble: 4 x 2
  Food             n
  <chr>        <int>
1 Pizza            1
2 Pizza, Tacos     2
3 Tacos            1

Antworten

3 Duck Dec 09 2020 at 21:15

Versuche dies. Sie können verdoppeln summarise(), um das erwartete Ergebnis zu erhalten:

library(dplyr)
#Code
new <- customerDataFrame %>%
  arrange(CustomerID,Food)%>%
  group_by(CustomerID) %>%
  summarise(Food=paste0(Food,collapse = ',')) %>%
  group_by(Food,.drop = T) %>%
  summarise(N=n())

Ausgabe:

# A tibble: 3 x 2
  Food            N
  <chr>       <int>
1 Pizza           1
2 Pizza,Tacos     2
3 Tacos           1

Der gleiche Ausgang kann erreicht werden mit 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

Wenn Sie mit toString sortdem zusammenbrechen 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

In base Rkönnen wir tablemit verwendenaggregate

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

#  Pizza Pizza, Tacos        Tacos 
#      1            2            1