Apakah ada solusi di R untuk menghasilkan kombinasi unik dan frekuensinya?

Dec 09 2020

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

3 Duck Dec 09 2020 at 21:15

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

Ketika Anda runtuh menggunakan toString sortyang 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

Dalam base R, kita bisa menggunakan tabledenganaggregate

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

#  Pizza Pizza, Tacos        Tacos 
#      1            2            1