Memahami fungsi perpipaan dan ringkasan dplyr

Aug 20 2020

Saya mencari bantuan untuk memahami fungsi perpipaan dan meringkas menggunakan dplyr. Saya merasa pengkodean saya agak bertele-tele dan dapat disederhanakan. Jadi ada beberapa pertanyaan di sini karena saya tahu saya kehilangan beberapa konsep, tapi saya tidak begitu yakin di mana kurangnya pengetahuan itu. Saya telah memasukkan kode lengkap saya di bagian bawah. Terima kasih sebelumnya karena ini adalah permintaan yang sedikit lebih besar.

1a. Dari contoh data di bawah ini dan menggunakan dplyr, apakah ada cara untuk menghitung permainan (tanggal) per tim tanpa menggunakan tabel perantara?

1b. Saya telah menyertakan cara asli saya untuk menghitung n_games yang tidak berhasil. Mengapa?

set.seed(123)
shot_df_ex <- tibble(Team_Name = sample(LETTERS[1:5],250, replace = TRUE),
                     Date = sample(as.Date(c("2019-08-01",
                                             "2019-09-01",
                                             "2018-08-01",
                                             "2018-09-01",
                                             "2017-08-01",
                                             "2017-09-01")), 
                                   size = 250, replace = TRUE),
                     Type = sample(c("shot","goal"), size = 250, 
                                   replace = TRUE, prob = c(0.9,0.1))
)

# count shots per team per game(date)
n_shots_per_game <- shot_df_ex %>% 
  count(Team_Name,Date)

n_shots_per_game

# count games (dates) per team [ISSUES!!!]
# is there a way to do this piping from the shot_df_ex tibble instead of 
#  using an intermediate tibble?

# count number of games using the tibble created above [DOES NOT WORK--WHY?]
n_games <- n_shots_per_game %>% 
  count(Team_Name)

n_games #what is this counting? It should be 6 for each.

# this works, but isn't count() just a quicker way to run
#  group_by() %>% summarise()? 
n_games <- n_shots_per_game %>% 
  group_by(Team_Name) %>% 
  summarise(N_Games=n())

n_games
  1. Di bawah ini adalah proses saya membuat tabel ringkasan. Saya memahami bahwa perpipaan dimaksudkan untuk memotong pembuatan beberapa variabel / tabel perantara. Di mana saya dapat menggabungkan langkah-langkah di bawah ini untuk membuat tabel akhir dengan jumlah minimum langkah menengah.
# load librarys ------------------------------------------------
library(tidyverse)

# build sample shot data ---------------------------------------
set.seed(123)
shot_df_ex <- tibble(Team_Name = sample(LETTERS[1:5],250, replace = TRUE),
                     Date = sample(as.Date(c("2019-08-01",
                                             "2019-09-01",
                                             "2018-08-01",
                                             "2018-09-01",
                                             "2017-08-01",
                                             "2017-09-01")), 
                                   size = 250, replace = TRUE),
                     Type = sample(c("shot","goal"), size = 250, 
                                   replace = TRUE, prob = c(0.9,0.1))
)

# calculate data ----------------------------------------------
# since every row is a shot, the following function counts shots for ea. team
n_shots <- shot_df_ex %>% 
  count(Team_Name) %>% 
  rename(N_Shots = n)

n_shots

# do the same for goals for each team
n_goals <- shot_df_ex %>% 
  filter(Type == "goal") %>% 
  count(Team_Name,sort = T) %>% 
  rename(N_Goals = n) %>% 
  arrange(Team_Name)

n_goals

# count shots per team per game(date)
n_shots_per_game <- shot_df_ex %>% 
  count(Team_Name,Date)

n_shots_per_game

# count games (dates) per team [ISSUES!!!]
# is there a way to do this piping from the shot_df_ex tibble instead of 
#  using an intermediate tibble?

# count number of games using the tibble created above [DOES NOT WORK]
n_games <- n_shots_per_game %>% 
  count(Team_Name)

n_games #what is this counting? It should be 6 for each.

# this works, but isn't count() just a quicker way to run
#  group_by() %>% summarise()? 
n_games <- n_shots_per_game %>% 
  group_by(Team_Name) %>% 
  summarise(N_Games=n())

n_games

# combine data ------------------------------------------------
# combine columns and add average shots per game
shot_table_ex <- n_games %>% 
  left_join(n_shots) %>% 
  left_join(n_goals)

# final table with final average calculations
shot_table_ex <- shot_table_ex %>% 
  mutate(Shots_per_Game = round(N_Shots / N_Games, 1),
         Goals_per_Game = round(N_Goals / N_Games, 1)) %>% 
  arrange(Team_Name)

shot_table_ex

Jawaban

1 stlba Aug 19 2020 at 23:25

Untuk 1a, Anda bisa langsung menyalurkan dari fungsi tibble () ke count (). yaitu.

tibble(Team_Name = sample(LETTERS[1:5],250, replace = TRUE),
       Date = sample(as.Date(c("2019-08-01",
                               "2019-09-01",
                               "2018-08-01",
                               "2018-09-01",
                               "2017-08-01",
                               "2017-09-01")), 
                     size = 250, replace = TRUE),
       Type = sample(c("shot","goal"), size = 250, 
                     replace = TRUE, prob = c(0.9,0.1))) %>%
count(Team_Name,Date)

Dalam 1b, count () menggunakan kolom Anda n(mis. Jumlah pukulan) sebagai variabel pembobotan sehingga menjumlahkan jumlah total pukulan per tim, bukan jumlah baris. Ini mencetak pesan yang memberi tahu Anda ini:

Using `n` as weighting variable i Quiet this message with `wt = n` or count rows with `wt = 1`

Menggunakan count(Team_Name, wt=n())akan memberikan perilaku yang Anda inginkan.

Edit: bagian 2

shot_table_ex <- tibble(Team_Name = sample(LETTERS[1:5],250, replace = TRUE),
                    Date = sample(as.Date(c("2019-08-01",
                                            "2019-09-01",
                                            "2018-08-01",
                                            "2018-09-01",
                                            "2017-08-01",
                                            "2017-09-01")), 
                                  size = 250, replace = TRUE),
                    Type = sample(c("shot","goal"), size = 250, 
                                  replace = TRUE, prob = c(0.9,0.1))) %>%
     group_by(Team_Name) %>%
     summarise(n_shots = n(),
               n_goals = sum(Type == "goal"),
               n_games = n_distinct(Date)) %>%
     mutate(Shots_per_Game = round(n_shots / n_games, 1),
            Goals_per_Game = round(n_goals / n_games, 1))
1 GenesRus Aug 19 2020 at 23:36

1a. Dari contoh data di bawah ini dan menggunakan dplyr, apakah ada cara untuk menghitung permainan (tanggal) per tim tanpa menggunakan tabel perantara?

Beginilah cara saya melakukannya:

shot_df_ex %>% 
  distinct(Team_Name, Date) %>% #Keeps only the cols given and one of each combo
  count(Team_Name)

Anda juga bisa menggunakan unique:

shot_df_ex %>% 
  group_by(Team_Name) %>%
  summarize(N_Games = length(unique(Date))

1b. Saya telah menyertakan cara asli saya untuk menghitung n_games yang tidak berhasil. Mengapa?

Kode Anda berfungsi untuk saya. Apakah Anda mungkin menyimpan di atas tabel perantara? Ini menghitung 6 yang diharapkan per tim.

  1. Di bawah ini adalah proses saya membuat tabel ringkasan. Saya memahami bahwa perpipaan dimaksudkan untuk memotong pembuatan beberapa variabel / tabel perantara. Di mana saya dapat menggabungkan langkah-langkah di bawah ini untuk membuat tabel akhir dengan jumlah minimum langkah menengah?
shot_df_ex %>% 
  group_by(Team_Name) %>% 
  summarize(
    N_Games = length(unique(Date)),
    N_Shots = sum(Type == "shot"),
    N_Goals = sum(Type == "goal")
  ) %>% 
  mutate(Shots_per_Game = round(N_Shots / N_Games, 1),
         Goals_per_Game = round(N_Goals / N_Games, 1))

Anda dapat menggunakan beberapa langkah meringkas sekaligus selama Anda tidak perlu mengubah pengelompokan Anda. Kami mengambil keuntungan di sini (dalam sumpanggilan) dari interpretasi True sebagai 1 dan False sebagai 0. lengthtentu saja akan memberi kami panjang vektor yang dihasilkan oleh unique.

this (count) berfungsi, tetapi bukankah count () hanya cara yang lebih cepat untuk menjalankan group_by ()%>% summarize ()?

counthanyalah kombinasi dari group_by(col) %>% tally()dan penghitungan dasarnya summarize(x=n())jadi ya. :)