Gibt es in R eine Lösung, um eindeutige Kombinationen und deren Häufigkeit zu generieren?
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
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())
Wenn Sie mit toString
sort
dem 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
In base R
können wir table
mit verwendenaggregate
table(aggregate(Food ~ CustomerID,
customerDataFrame[do.call(order, customerDataFrame),], FUN = toString)$Food)
# Pizza Pizza, Tacos Tacos
# 1 2 1