2017-05-22 4 views
0

Ich arbeite mit MLB Statcast Daten in RStudio und versuche zu berechnen schwingenden Streik Prozentsatz (Anzahl der schwingenden Streiks geteilt durch die Gesamtneigung von geworfen Krug) für jeden einzelnen Krug. Für die Beispiele willen hier ist ein Beispieldatenrahmen:Teilen von spezifischen Faktoren innerhalb des Datenrahmens nach Anzahl der Zeiten, in denen sie in Dataframe (R) erscheinen

pitcher_name <- c('AJ Griffin','AJ Griffin','AJ Griffin','AJ Griffin','AJ Griffin', 
        'AJ Griffin','Adam Conley','Adam Conley','Adam Conley','Adam Conley', 
        'Adam Conley','Adam Conley') 

description <- c('foul','swinging_strike','swinging_strike','swinging_strike_blocked', 
       'ball','hit_into_play','swinging_strike','swinging_strike', 
       'swinging_strike','swinging_strike_blocked','swinging_strike_blocked','ball') 

pitch_analysis.data <- data.frame(pitcher_name, description) 

Das Endziel ist es, jeden Pitcher Schwingen Streiks zu zählen (beide Schwingen des Streichens und geschwungen Streik blockiert) und dann teilen diese Zahl durch die Summe der von den einzelnen Werfer geworfen Teilungen . Für dieses Beispiel sollte die endgültige Antwort 50% (3 schwingende Schläge über 6 Tonhöhen) für AJ Griffin und 83% für Adam Conley (5 schwingende Schläge über 6 Tonhöhen) betragen. Ich habe den folgenden Befehl mit dem dplyr Paket versucht:

P <- pitch_analysis.data %>% group_by(pitcher_name, description) %>% count(description) 

Das ist mir eine Zählung jeder Beschreibung gibt, aber ich bin nicht sicher, wie dplyr zu verwenden, um den letzten Schritt bekommen der Gruppierung der zwei Arten von Schwingen schlägt zusammen und teilt sich dann durch die Gesamtzahl der Tonhöhen für jeden Krug. Jede Eingabe wäre dankbar, danke!

+0

Basis-R-Option wäre die Verwendung von "aggregate", "aggregate" (Beschreibung ~ pitcher_name, pitch_analysis.data, Funktion (x) sum (grepl ("swinging_strike", x))/Länge (x)) '. –

Antwort

1

Mit den dplyr und stringr Pakete, könnten Sie tun:

library(dplyr) 
library(stringr) 
P <- pitch_analysis.data %>% 
group_by(pitcher_name) %>%  
summarise(r=sum(str_detect(description,"swinging"))/n()) 

Welche zurück:

pitcher_name   r 
     <fctr>  <dbl> 
1 Adam Conley 0.8333333 
2 AJ Griffin 0.5000000 

Wir erkennen das Wort "swinging" in der Beschreibung mit str_detect und zählen, wie viele Zeilen wird mit sum beobachtet. Die Gesamtzahl der Zeilen pro Gruppe wird durch n() angegeben.

0

Wie wäre es damit, nur dplyr zu verwenden?

pitch_analysis.data <- data_frame(pitcher_name, description) 
pitch_analysis.data %>% 
mutate(simplified_description=ifelse(description=="swinging_strike_blocked", 
    "swinging_strike", description)) %>% 
group_by(pitcher_name, simplified_description) %>% 
count(simplified_description) 

Source: local data frame [6 x 3] 
Groups: pitcher_name [?] 

    pitcher_name simplified_description  n 
     <chr>     <chr> <int> 
1 Adam Conley     ball  1 
2 Adam Conley  swinging_strike  5 
3 AJ Griffin     ball  1 
4 AJ Griffin     foul  1 
5 AJ Griffin   hit_into_play  1 
6 AJ Griffin  swinging_strike  3 
0

Hier ist eine Option data.table

library(data.table) 
setDT(pitch_analysis.data)[, .(r = sum(grepl('swinging', description))/.N), pitcher_name] 
# pitcher_name   r 
#1: AJ Griffin 0.5000000 
#2: Adam Conley 0.8333333 

Oder mit base R mit rowsum

with(pitch_analysis.data, rowsum(+(grepl('swinging', description)), 
     pitcher_name)/tabulate(pitcher_name)) 
#     [,1] 
#Adam Conley 0.8333333 
#AJ Griffin 0.5000000 

oder mit table/prop.table

mit
Verwandte Themen