Apakah ada solusi di R untuk menghasilkan kombinasi unik dan frekuensinya?
Ini kode saya. Saya mencoba untuk menghasilkan semua kombinasi yang tidak berulang dari kolom Makanan dan berapa kali itu muncul berdasarkan kolom 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())
Ini hasilnya sekarang:
# A tibble: 4 x 2
Food n
<chr> <int>
1 Pizza 1
2 Pizza, Tacos 1
3 Tacos 1
4 Tacos, Pizza 1
Ini secara teknis tidak benar karena pelanggan yang membeli (Pizza, Tacos) dan (Tacos, Pizza) harus berada dalam grup yang sama. Tidak masalah pesanan apa yang mereka beli.
(Saya mendapat kode dari jawaban ini: Menggunakan dplyr untuk membuat vektor kombinasi nilai unik untuk grup tertentu )
Inilah yang saya coba dapatkan:
# A tibble: 4 x 2
Food n
<chr> <int>
1 Pizza 1
2 Pizza, Tacos 2
3 Tacos 1
Jawaban
Coba ini. Anda dapat menggandakan summarise()
untuk mendapatkan hasil yang diharapkan:
library(dplyr)
#Code
new <- customerDataFrame %>%
arrange(CustomerID,Food)%>%
group_by(CustomerID) %>%
summarise(Food=paste0(Food,collapse = ',')) %>%
group_by(Food,.drop = T) %>%
summarise(N=n())
Keluaran:
# A tibble: 3 x 2
Food N
<chr> <int>
1 Pizza 1
2 Pizza,Tacos 2
3 Tacos 1
Output yang sama dapat dicapai dengan menggunakan toString()
:
#Code 2
new <- customerDataFrame %>%
arrange(CustomerID,Food)%>%
group_by(CustomerID) %>%
summarise(Food=toString(Food)) %>%
group_by(Food,.drop = T) %>%
summarise(N=n())
Ketika Anda runtuh menggunakan toString
sort
yang 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
Dalam base R
, kita bisa menggunakan table
denganaggregate
table(aggregate(Food ~ CustomerID,
customerDataFrame[do.call(order, customerDataFrame),], FUN = toString)$Food)
# Pizza Pizza, Tacos Tacos
# 1 2 1