2017-07-27 4 views
1

Dies ist eher eine Code-Reinigungsübung, die ich gerade mache. Was wie meine Anfangsdaten sieht, ist dies:Mehrere Aufräumarbeiten in einer Pipeline

Year County Town ... Funding Received ... (90+ Variables total) 
2016  a  x    Yes 
2015  a  y    No 
2014  a  x    Yes 
2016  b  z    Yes 

ich nicht sehen konnte, wie ich diese eine Anzahl von eingereichten und genehmigten Anträge von so bekommen konnte ich es Indikatorvariablen transformiert mit dem folgenden Code gezählt werden:

counties <- original_data %>% 
    select(county, funded, year) %>% 
    mutate(
    a=ifelse(county == "a", 1,0), 
    b=ifelse(county == "b", 1,0), 
    c=ifelse(county == "c", 1,0), 
    ... etc ... 
) 

und die Ausgabe sieht aus wie

County Funding Received Year binary.a binary.b 
    a    Yes   2016  1   0 
    a    No   2015  1   0 
    b    No   2016  0   1 

Diese Daten werden dann in zwei Datenrahmen umgewandelt wurde (vorgelegt und finanziert) eine Zählung der einzelnen Grafschaft vorgelegt und f zu erhalten unded Anwendungen pro Jahr mit dem folgenden Code:

countysum <- counties %>% 
    select(-funded) %>% 
    group_by(county, year) %>% 
    summarise_all(sum, na.rm = T) 

Und die Ausgabe wie folgt aussieht:

County Year sum.a sum.b 
    a  2016  32  0 
    a  2015  24  0 
    b  2016  0  16 

Aber dann die Daten in einem aufgeräumter Format zu bekommen ich noch ein paar Befehle verwendet:

countysum$submitted <- rowSums(countysum[,3:15, na.rm = T) #3:15 are county indicator vars 
countysum <- countysum[,-c(3:19)] 

Jetzt ist meine Frage: Gibt es eine Möglichkeit, all diese Aktionen in eine einzige Pipeline zu reduzieren? Im Moment habe ich Code, der funktioniert, würde aber lieber einen Code haben, der funktioniert und ein wenig einfacher zu folgen ist. Entschuldigung für fehlende Daten, ich kann es nicht teilen.

+0

Werfen Sie einen Blick auf 'tidyr :: spread' - ich denke, das ist, was Sie im ersten Abschnitt zu tun versuchen –

+0

Bitte zeige ein kleines reproduzierbares Beispiel. In Ihrem Code gibt es "funded", aber in dem Beispiel ist es nicht gezeigt – akrun

+0

@akrun mein Fehler, "finanziert" entspricht "Funding Received" im ursprünglichen Beitrag. – MokeEire

Antwort

0

Ich bin mir nicht sicher, ob ich wirklich verstehe, wie Ihre endgültige Ausgabe aussieht, aber ich denke, Sie können die Tatsache ausnutzen, dass logische Werte in Ganzzahlen umgewandelt werden und die Erstellung von Dummy-Spalten übersprungen wird.

library(dplyr) 

byyear <- original_data %>% 
    group_by(county, year) %>% 
    summarize(
     wasfunded = any(funded == "Yes", na.rm = T) 
    , submittedapplication = any(submittedapp == "Yes", na.rm = T) # I'm assuming did/didn't submit is one of the other variables 
    ) 

# if you don't need the byyear data for something else (I always seem to), 
# you can pipe that straight into this next line 
yrs_funded_by_county <- byyear %>% 
    summarize(
     n_yrs_funded = sum(wasfunded) 
    , n_yrs_submitted = sum(submittedapplication) 
    , pct_awarded = n_yrs_funded/n_yrs_submitted # maybe you don't need a award rate, but I threw it it b/c it's the kind of stuff my grant person cares about 
) 
Verwandte Themen