¿Existe una solución en R para generar combinaciones únicas y su frecuencia?
Aquí está mi código. Estoy tratando de generar todas las combinaciones no repetidas de la columna Comida y cuántas veces aparece dada la columna 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())
Aquí está la salida ahora mismo:
# A tibble: 4 x 2
Food n
<chr> <int>
1 Pizza 1
2 Pizza, Tacos 1
3 Tacos 1
4 Tacos, Pizza 1
Esto es técnicamente incorrecto porque los clientes que compran (pizza, tacos) y (tacos, pizza) deben estar en el mismo grupo. No importa en qué orden compren.
( Obtuve el código de esta respuesta: usando dplyr para crear un vector de combinaciones únicas de valores para un grupo dado )
Esto es lo que estoy tratando de conseguir:
# A tibble: 4 x 2
Food n
<chr> <int>
1 Pizza 1
2 Pizza, Tacos 2
3 Tacos 1
Respuestas
Prueba esto. Puede duplicar summarise()
para obtener el resultado esperado:
library(dplyr)
#Code
new <- customerDataFrame %>%
arrange(CustomerID,Food)%>%
group_by(CustomerID) %>%
summarise(Food=paste0(Food,collapse = ',')) %>%
group_by(Food,.drop = T) %>%
summarise(N=n())
Producción:
# A tibble: 3 x 2
Food N
<chr> <int>
1 Pizza 1
2 Pizza,Tacos 2
3 Tacos 1
Se puede alcanzar la misma salida usando toString()
:
#Code 2
new <- customerDataFrame %>%
arrange(CustomerID,Food)%>%
group_by(CustomerID) %>%
summarise(Food=toString(Food)) %>%
group_by(Food,.drop = T) %>%
summarise(N=n())
Cuando está colapsando usando toString
sort
el 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
En base R
, podemos usar table
conaggregate
table(aggregate(Food ~ CustomerID,
customerDataFrame[do.call(order, customerDataFrame),], FUN = toString)$Food)
# Pizza Pizza, Tacos Tacos
# 1 2 1