2016-07-25 14 views
5

Mam zestaw danych, który wygląda jakJak utworzyć inny raport dla każdego podzbioru ramki danych ze znacznikiem R?

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 

Chciałbym zbudować raport używając R przecen; jednak dla każdego miasta muszę zbudować raport. Powodem tego jest fakt, że jedno miasto nie widzi raportu dla innego miasta. Jak utworzyć raport i zapisać jego plik PDF dla każdego miasta?

Każdy raport będzie wymagał medianę Score, średnia Count i oznacza Returns. Wiem, że za pomocą dplyr może po prostu użyć

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

Ale frustracji pochodzi z produkcji raport dla każdego City. Jest to również podzbiór danych, a nie pełne dane. To znaczy, że sprawozdanie to jest obszerne i jest raportem z wyników, który jest systematyczny, nie różni się dla każdego City.

Odpowiedz

7

Wygląda na to, że potrzebna może być parameterized report. Zobacz łącze, aby uzyskać szczegółowe informacje, ale podstawową ideą jest ustawienie parametru w raporcie yaml w raporcie i użycie tego parametru w raporcie w celu dostosowania go (na przykład poprzez filtrowanie danych według City w twoim przypadku). Następnie w oddzielnym skrypcie R, ty render raport wiele razy, raz dla każdej wartości City, którą przekazujesz jako parametr do funkcji render. Oto podstawowy przykład:

W swoim raporcie Rmarkdown można zadeklarować parametr w yaml. Podana wartość, Dallas w tym przypadku, to tylko wartość domyślną, jeśli żadna inna wartość jest wprowadzana podczas renderowania raportu:

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

Następnie, w tym samym Rmarkdown dokumentu trzeba cały raport - cokolwiek obliczeń zależy od City, a także od wzornika, który jest taki sam dla każdego City. Dostęp do parametru uzyskasz za pomocą params$My_City. Poniższy kod będzie filtrować ramki danych do aktualnej wartości parametru My_City:

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

Następnie w osobnym skrypcie R, byś zrobił coś takiego do pliku produkować oddzielny raport dla każdego City (gdzie ja wcześniej zakłada plik Rmarkdown powyżej nazywa MyReport.Rmd):

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

w kodzie powyżej, mam przyjąć, rama dat danych w środowisku globalnym tego oddzielnego skryptu R, który renderuje MyReport.Rmd. Można jednak po prostu podać wektor nazw miast zamiast uzyskać nazwy od unique(dat$City).

+0

Więc musisz oddzielić skrypt od R Markdown do pętli trhough? Czy byłoby bardziej skuteczne stworzenie funkcji do tego? – akash87

+0

Tak na pierwsze pytanie (AFAIK). Nie wiem, jak to zrobić w dokumencie Rmarkdown. Jeśli chodzi o twoje drugie pytanie, jeśli masz zamiar robić to regularnie, może to mieć sens, aby utworzyć funkcję, aby to zrobić. Szczególnie, jeśli chcesz ułatwić dostosowywanie lub generowanie raportu. – eipi10

+0

Nadal nie jestem jasne, dlaczego muszę określić 'My_City: Dallas' w moim' Rmarkdown'? Czy zmienia się, kiedy używam pętli 'for'? – akash87