Циклы, knitr и xtable в rmarkdown для создания уникальных таблиц в нескольких отчетах

Я пересматриваю свой вопрос полностью. Я понял, что это было долго, и моя точка зрения терялась.

Вот что мне нужно сделать:

Создавайте автоматические отчеты для школ, которые содержат таблицы, в которых сравниваются их данные с округом, в котором находится школа, а также со всем штатом. Состояние - это весь набор данных.

Вот что я понимаю:

Как создать автоматизированный цикл, который просматривает данные и создает уникальный отчет в формате PDF для каждой школы. Этот пост был очень полезен при настройке структуры для генерации отчетов.

Вот что мне нужно помочь с:

Мне нужна таблица, содержащая следующие столбцы: Школа, Район, Штат. Мне также нужен первый столбец таблицы, в котором должна быть строка: Размер выборки, Среднее, Стандартное отклонение.

Я пытаюсь создать это в контексте цикла for, потому что мне нужна уникальная таблица в каждом уникальном PDF-файле, который создается. Если есть лучший подход, я хотел бы услышать об этом.

В любом случае, вот воспроизводимый пример, который я проверял. Я не продвинулся далеко в создании стола.

Любая помощь будет принята с благодарностью.

driver.r:

# Create dataset
set.seed(500)
School <- rep(seq(1:20), 2)
District <- rep(c(rep("East", 10), rep("West", 10)), 2)
Score <- rnorm(40, 100, 15)
Student.ID <- sample(1:1000,8,replace=T)
school.data <- data.frame(School, District, Score, Student.ID)

#prepare for multicore processing 
require(parallel)
# generate the rmd files, one for each school in df
library(knitr)
mclapply(unique(school.data$School), function(x) 
  knit("F:/sample-auto/auto.Rmd", 
       output=paste('report_', x, '.Rmd', sep="")))

# generate PDFs from the rmd files, one for each school in df
mclapply(unique(school.data$School), function(x)
  rmarkdown::render(paste0("F:/sample-auto/", paste0('report_', x, '.Rmd'))))

auto.Rmd:

---
title: "Automated Report Generation for Data"
author: "ME"
date: "February 5, 2015"
output: 
  pdf_document:
  toc: true
  number_sections: true
---

```{r, echo=FALSE}
library(xtable)
library(plyr)
df <- data.frame(school.data)
subgroup <- df[school.data$School == x,]
```

# Start of attempt 

```{r results='asis', echo=FALSE}
 for(school in unique(subgroup$School))
{
subgroup2 <- subgroup[subgroup$School == school,]
savename <- paste(x, school)
df2<- mean(subgroup2$Score, na.rm=TRUE)
df2 <- data.frame(df2)
print(xtable(df2))
}
```

Я также попытался заменить цикл на:

```{r results='asis', echo=FALSE}
df2 <- ddply(school.data, .(School), summarise, n = length(School), mean =      
mean(Score), sd = sd(Score))
print(xtable(df2))
```

Это дает мне то, чего я не хочу, так как все школы получают данные по каждой школе, а не только по своей школе.

1 ответ

Решение

Если вы используете цикл для подмножества данных перед их передачей в файл.rmd, вам на самом деле не нужны plyr или ddply, чтобы выполнить разделение / применение / объединение для вас. Поскольку у вас много наблюдений, это может быть заметно накладными расходами.

Также, если вы создаете подгруппы перед запуском.rmd, вам также не нужен цикл внутри файла. Вам просто нужно сделать фрейм данных с нужной вам статистикой и использовать xtable

---
title: "Automated Report Generation for Data"
author: "ME"
date: "February 5, 2015"
output: 
  pdf_document:
    toc: true
    number_sections: true
---

```{r, echo=FALSE}
library(xtable)
library(plyr)
# Create dataset
set.seed(500)
School <- rep(seq(1:20), 2)
District <- rep(c(rep("East", 10), rep("West", 10)), 2)
Score <- rnorm(40, 100, 15)
Student.ID <- sample(1:1000,8,replace=T)
school.data <- data.frame(School, District, Score, Student.ID)


x <- unique(school.data$School)[1]
subgroup <- school.data[school.data$School == x, ]
```

# Start of attempt 

```{r results='asis', echo=FALSE}
options(xtable.comment = FALSE)
## for one school, it is redundant to split based on school but works
## likewise, it is redundant to have a loop here to split based on school
## if you have already used a loop to create the subgroup data 
res <- ddply(subgroup, .(School), summarise,
             n = length(School),
             mean = mean(Score),
             SD = sd(Score),
             VAR = var(Score))
xtable(res)

## if you pass in the entire data frame you will get all schools
## then you can subset the one you want
res <- ddply(school.data, .(School), summarise,
             n = length(School),
             mean = mean(Score),
             SD = sd(Score),
             VAR = var(Score))

xtable(res[res$School %in% x, ])
```

Другие вопросы по тегам