2016-07-25 13 views
5

Ich habe einen Datensatz, wieWie erstellt man einen anderen Bericht für jede Teilmenge eines Datenrahmens mit R Markdown?

City Score Count Returns 
Dallas 2.9 61 21 
Phoenix 2.6 52 14 
Milwaukee 1.7 38 7 
Chicago 1.2 95 16 
Phoenix 5.9 96 16 
Dallas 1.9 45 12 
Dallas 2.7 75 45 
Chicago 2.2 75 10 
Milwaukee 2.6 12 2 
Milwaukee 4.5 32 0 
Dallas 1.9 65 12 
Chicago 4.9 95 13 
Chicago 5 45 5 
Phoenix 5.2 43 5 

I Abschlag einen Bericht mit R aussieht möchte bauen; Allerdings muss ich für jede Stadt einen Bericht erstellen. Der Grund dafür ist, dass eine Stadt den Bericht für eine andere Stadt nicht sehen kann. Wie erstelle ich einen Bericht und speichere ihn für jede Stadt als PDF?

Jeder Bericht würde den Median Score, Mittelwert Count und Mittelwert Returns benötigen. Ich weiß, dass dplyr mit ich einfach

finaldat <- dat %>% 
      group_by(City) %>% 
      summarise(Score = median(Score), 
         Count = mean(Count) , 
         Return= mean(Returns)) 

Aber die Frustration kommt von der Erstellung eines Berichtes für jeden City nutzen könnten. Dies ist auch eine Teilmenge der Daten, nicht die vollständigen Daten. Das heißt, dieser Bericht ist umfangreich und ist ein Bericht der Ergebnisse, der systematisch ist, nicht für jede City unterschiedlich.

Antwort

7

Es sieht aus wie ein parameterized report könnte was Sie brauchen. Siehe den Link für Details, aber die Grundidee ist, dass Sie einen Parameter im yaml Ihres Berichts festlegen und diesen Parameter innerhalb des Berichts verwenden, um ihn anzupassen (z. B. durch Filtern der Daten in Ihrem Fall durch City). Dann in einem separaten R-Skript, Sie render den Bericht mehrmals, einmal für jeden Wert von City, die Sie als Parameter an die render-Funktion übergeben. Hier ein einfaches Beispiel:

In Ihrem Rmarkdown Bericht würden Sie den Parameter im yaml deklarieren. Der angegebene Wert, Dallas in diesem Fall ist nur der Standardwert, wenn kein anderer Wert eingegeben wird, wenn Sie den Bericht machen:

--- 
title: My Document 
output: pdf_document 
params: 
    My_City: Dallas 
--- 

Dann in dem gleichen Rmarkdown Dokument, das Sie Ihren gesamten Bericht haben würden - unabhängig von Berechnungen abhängig von City, zuzüglich der Boilerplate, die für alle City gleich ist. Sie greifen auf den Parameter mit params$My_City zu. Der folgende Code wird den Datenrahmen auf den aktuellen Wert des My_City Parameters filtert:

```{r} 
dat %>%   
    filter(City==params$My_City) %>% 
    summarise(Score = median(Score), 
       Count = mean(Count) , 
       Return= mean(Returns)) 
``` 

Dann wird in einem separaten R-Skript, würden Sie etwas tun, wie folgt aus einem separaten Bericht für jeden City zu erzeugen (wo ich habe die Rmarkdown Datei oben angenommen MyReport.Rmd) aufgerufen wird:

for (i in unique(dat$City)) { 
    rmarkdown::render("MyReport.Rmd", 
         params = list(My_City = i), 
         output_file=paste0(i, ".pdf")) 
} 

oben in dem Code ich die dat Datenrahmen angenommen haben im globalen Umfeld dieses separaten R Skript, das MyReport.Rmd macht. Sie können jedoch auch einfach einen Vektor von Städtenamen angeben, anstatt die Namen von unique(dat$City) zu erhalten.

+0

Sie müssen also ein Skript von der R Markdown zu Schleife trough trennen? Wäre es effektiver, hierfür eine Funktion zu erstellen? – akash87

+0

Ja zu Ihrer ersten Frage (AFAIK). Ich kenne keine Möglichkeit, dies im Rmarkdown-Dokument zu tun. Was Ihre zweite Frage anbelangt, wenn Sie dies regelmäßig tun, könnte es sinnvoll sein, eine Funktion dafür zu erstellen. Vor allem, wenn Sie den Bericht einfach anpassen oder verallgemeinern möchten. – eipi10

+0

Ich bin immer noch nicht klar, warum ich 'My_City: Dallas' in meinem' Rmarkdown' angeben muss? Ändert sich das, wenn ich die for-Schleife verwende? – akash87