本指南介紹了如何使用RStudio自動使用R和R Markdown進(jìn)行調(diào)查摘要。這對于不改變的文檔部分是很好的(例如锭硼,“調(diào)查顯示了實(shí)質(zhì)上的黨派偏振”)督禽。動機(jī)實(shí)際上是雙重的:效率(最大化代碼的可重用性,最小化復(fù)制和粘貼錯誤)和可重復(fù)性(最大化可以重現(xiàn)發(fā)現(xiàn)的人和計(jì)算機(jī)的數(shù)量)芹橡。
基本設(shè)置是編寫一個Rmd用作模板的文件讥耗,然后編寫一個循環(huán)遍歷每個數(shù)據(jù)文件的簡短R腳本(使用library(knitr))有勾。所述render然后功能會將Rmd到文檔或幻燈片(通常在PDF,HTML或docx通過取文件元數(shù)據(jù)作為)參數(shù)古程。
有無數(shù)的方法來概括調(diào)查R.本指南介紹了一些基礎(chǔ)知識蔼卡,ggplot和questionr,但著眼于整個工作流(文件管理等)挣磨。按照這里的說明雇逞,您應(yīng)該能夠重現(xiàn)所有四個報(bào)告(原則上,更多)茁裙,盡管只編寫代碼來清理一個調(diào)查塘砸。大多數(shù)代碼都顯示在本文檔中,但所有代碼都可以在pewpoliticaltemplate.Rmd或中找到pew_report_generator.R晤锥。所有代碼以及輸出的文檔都可以在這里找到掉蔬,有關(guān)獲取數(shù)據(jù)的詳細(xì)信息廊宪,請參見下文。
軟件
RStudio的界面library(rmarkdown)正在迅速發(fā)展女轿。強(qiáng)烈建議安裝當(dāng)前版本的RStudio箭启,特別是對于R Markdown代碼的預(yù)覽(此文檔是使用RStudio 1.1.83創(chuàng)建的)。(這是我的安裝指南蛉迹,其中包含教程和備忘單的鏈接傅寡。有關(guān)更高級的調(diào)查數(shù)據(jù)清理,請單擊此處北救。)
即使你以前編織過Rmd荐操,你的庫也可能不夠新,無法創(chuàng)建參數(shù)化報(bào)告珍策。我建議安裝pacman托启,它具有便利功能p_load,可以平滑包安裝膛壹,裝載和維護(hù)驾中。p_load如果你在Dropbox上進(jìn)行合作唉堪,我會特別推薦模聋。
install.packages("pacman")
p_load(rmarkdown, knitr, foreign, scales, questionr, tidyverse, update = TRUE)
記住PDF要求LaTeX (安裝鏈接)。相比之下唠亚,針織docx或HTML不需要LaTeX链方。pptx可以在R中創(chuàng)建library(ReporteRs),但這里不討論灶搜。
數(shù)據(jù)
下載來自皮尤研究四個“政治調(diào)查”可以在這里(即一月祟蚀,三月,八月和十月2016)割卖。你可能還記得前酿,有些政治事件發(fā)生在2016年。(這些數(shù)據(jù)是免費(fèi)的鹏溯,只要你花一點(diǎn)時間來開帳戶罢维。)
- 如果需要,解壓縮每個zip文件夾丙挽。
我的三個文件夾都有直觀的名字(Jan16肺孵,Mar16和Oct16),但我的一個文件夾里有一個冗長的名字颜阐,http___www.people-press.org_files_datasets_Aug16平窘。別擔(dān)心。
創(chuàng)建一個新文件夾凳怨,調(diào)用它瑰艘,比如說automating是鬼。
將所有四個數(shù)據(jù)文件夾移動到automating。
請注意紫新,我與Pew Research沒有任何關(guān)系(過去或現(xiàn)在)屑咳。我只是認(rèn)為他們做了很棒的工作,并且他們可以相對輕松地開始使用有意義的數(shù)據(jù)集弊琴。
Markdown 模版
在RStudio中兆龙,創(chuàng)建一個新的R筆記本并將其保存為剛剛創(chuàng)建pewpoliticaltemplate.Rmd的automating文件夾。該文件可能HTML默認(rèn)編織; 按住編織按鈕將其更改為PDF敲董。根據(jù)需要向標(biāo)題添加字段紫皇。下面的示例標(biāo)題通過解析Date:R代碼旁邊的表達(dá)式自動將今天的日期放在文檔上。classoption: landscape可能有助于廣泛的表格腋寨。您還可以使用多種格式指定包含參考書目的文件聪铺,例如BibTex和EndNote (引文詳細(xì)信息)。
接下來添加一個R代碼塊來pewpoliticaltemplate.Rmd處理格式化等背景內(nèi)容萄窜。雖然只需編織設(shè)置工作目錄Rmd铃剔,但必須設(shè)置目錄knitr::opts_knit$set(root.dir = '...')以自動執(zhí)行文檔準(zhǔn)備。(如果您仍在編輯查刻,setwd則不需要Rmd键兜,但Console建議單獨(dú)設(shè)置工作目錄。)
[圖片上傳失敗...(image-37c147-1547913882066)]
右上角的“播放”按鈕可以預(yù)覽代碼的輸出穗泵,非常方便普气。如果分析的某些部分非常冗長,則只需運(yùn)行一次佃延,即可讓您對圖形等進(jìn)行修補(bǔ)现诀。
現(xiàn)在已經(jīng)設(shè)置了默認(rèn)設(shè)置,您無需擔(dān)心每個代碼塊都會抑制警告等履肃。當(dāng)然仔沿,您可以根據(jù)需要逐個更改它們。
與R不同尺棋,在設(shè)置單個代碼塊的格式選項(xiàng)時(如上所示封锉,在默認(rèn)啟動之前禁止顯示警告),您需要輸入單詞TRUE并FALSE完整填寫陡鹃。
與模板不同烘浦,在本文檔中,我將默認(rèn)值設(shè)置為echo = TRUE并tidy = TRUE更好地顯示R代碼萍鲸。
該設(shè)置asis = TRUE對專業(yè)格式的表非常有用(如下所示)闷叉,但不建議用于矩陣和表的原始R輸出。要kable默認(rèn)顯示原始數(shù)據(jù)框脊阴,請參見此處握侧。
我發(fā)現(xiàn)最簡單的方法是編寫一個完整的工作示例蚯瞧,然后根據(jù)需要進(jìn)行少量更改,以便knitr::render()循環(huán)遍歷數(shù)據(jù)集品擎。首先要做的事情埋合。
survey <- read.spss("Jan16/Jan16 public.sav", to.data.frame = TRUE)
可以輕松地將摘要統(tǒng)計(jì)信息插入到文本中,如下所示:
[圖片上傳中...(image-a6b159-1547913649827-0)]
該模板包含具有調(diào)查權(quán)重的其他示例(較長的計(jì)算應(yīng)在代碼塊中完成萄传,然后使用該內(nèi)聯(lián)樣式引用其結(jié)果)甚颂。
這是我們可能想要的基本情節(jié),它反映了調(diào)查權(quán)重秀菱。facet_grid()用于為每個參與方識別創(chuàng)建類似的圖振诬。該圖使用稍微不穩(wěn)定的語法y = (..count..)/sum(..count..)將結(jié)果顯示為百分比而不是計(jì)數(shù)。請注意衍菱,為簡潔起見赶么,省略了一些清理數(shù)據(jù)的代碼(主要是縮短標(biāo)簽),但可以在此處找到脊串。
我發(fā)現(xiàn)最簡單的方法是編寫一個完整的工作示例辫呻,然后根據(jù)需要進(jìn)行少量更改,以便knitr::render()循環(huán)遍歷數(shù)據(jù)集琼锋。首先要做的事情放闺。
survey <- read.spss("Jan16/Jan16 public.sav", to.data.frame = TRUE)
可以輕松地將摘要統(tǒng)計(jì)信息插入到文本中,如下所示:
該模板包含具有調(diào)查權(quán)重的其他示例(較長的計(jì)算應(yīng)在代碼塊中完成斩例,然后使用該內(nèi)聯(lián)樣式引用其結(jié)果)雄人。
這是我們可能想要的基本情節(jié)从橘,它反映了調(diào)查權(quán)重念赶。facet_grid()用于為每個參與方識別創(chuàng)建類似的圖。該圖使用稍微不穩(wěn)定的語法y = (..count..)/sum(..count..)將結(jié)果顯示為百分比而不是計(jì)數(shù)恰力。請注意叉谜,為簡潔起見,省略了一些清理數(shù)據(jù)的代碼(主要是縮短標(biāo)簽)踩萎,但可以在此處找到停局。
PA <- ggplot(survey) + theme_minimal()
PA <- PA + geom_bar(aes(q1, y = (..count..)/sum(..count..), weight = weight,
fill = q1))
PA <- PA + facet_grid(party.clean ~ .) + theme(strip.text.y = element_text(angle = 45))
PA <- PA + xlab("") + ylab("Percent of Country")
PA <- PA + ggtitle("Presidential Approval: January 2016")
PA <- PA + scale_y_continuous(labels = scales::percent)
PA
以下是加權(quán)交叉表的示例。knitr::kable將創(chuàng)建一個專業(yè)的表格(當(dāng)編織時PDF; kable采用學(xué)術(shù)期刊的風(fēng)格)香府。
kable(wtd.table(surveysex, survey$weight)/nrow(survey), digits = 2)
假設(shè)我們要顯示總統(tǒng)批準(zhǔn)董栽,其中第一列提供整體批準(zhǔn),后續(xù)列是各種感興趣因素的交叉表(使用單元格權(quán)重)企孩。我寫了一個名為Xtabs的便利函數(shù)來創(chuàng)建這種格式锭碳,這在調(diào)查領(lǐng)域很常見。
source("[https](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[://](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[raw](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[.](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[githubusercontent](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[.](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[com](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[/](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[rdrr1990](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[/](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[datascience101](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[/](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[master](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[/](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[automating](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[/](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[Xtabs](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[.](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)[R](https://raw.githubusercontent.com/rdrr1990/datascience101/master/automating/Xtabs.R)")
kable(Xtabs(survey, "q1", c("sex", "race"), weight = "cellweight"))
假設(shè)我們想做很多交叉表勿璃。語法survey$ideo被廣泛用于方便擒抛,但survey[["ideo"]]它將更好地為我們服務(wù)推汽,因?yàn)樗试S我們使用變量名稱的向量(來自win-vector的細(xì)節(jié))。下面歧沪,前兩個比較調(diào)用是相同的歹撒,但最后一個不是因?yàn)閿?shù)據(jù)框中沒有變量“x” survey。
identical(survey$ideo, survey[["ideo"]])
[1] TRUE
x <- "ideo"
identical(survey[[x]], survey[["ideo"]])
[1] TRUE
identical(survey[[x]], survey$x)
[1] FALSE
所以說我們希望所有問題20,21,22交叉的意識形態(tài)和黨ID的加權(quán)交叉表.29诊胞。這里有一些代碼可以做到這一點(diǎn)暖夭。
x <- names(survey)[grep("q2[[:digit:]]", names(survey))]
x
[1] "q20" "q21" "q22a" "q22b" "q22c" "q22d" "q22e" "q22f" "q22g" "q22h"
[11] "q22i" "q25" "q26" "q27" "q28"
y <- c("ideo", "party")
for (i in x) {
for (j in y) {
cat("\nWeighted proportions for", i, "broken down by", j, "\n")
print(kable(wtd.table(survey[[i]], survey[[j]], survey$weight)/nrow(survey),
digits = 2))
cat("\n") # break out of table formatting
}
cat("\\newpage")
}
幾點(diǎn)說明:
此代碼僅適用于asis設(shè)置(如上所示),該設(shè)置允許knitr將輸出解釋print(kable())為要呈現(xiàn)的內(nèi)容(而不僅僅是顯示用于其他地方的Markdown代碼)撵孤。
理想情況下鳞尔,人們會有一個csv或data.frame多個問題,并將其顯示為循環(huán)切換問題早直。在這種情況下寥假,調(diào)查問卷是在一個docx,所以library(docxtrackr)可能有所幫助霞扬。
而不是嵌套循環(huán)糕韧,人們可能更愿意選擇一個問題,循環(huán)交叉表的人口統(tǒng)計(jì)和意識形態(tài)類別喻圃,然后插入評論和概述萤彩。
外部循環(huán)在每次運(yùn)行時都會生成一個新頁面,內(nèi)部循環(huán)使用cat("\newpage"))斧拍,特定于渲染為PDF雀扶。\n需要額外的換行符來打破表格格式并保持代碼和文本分開。docx需要一種不同的分頁方法肆汹。
使用參數(shù)調(diào)整模版
下一步是添加一個包含所需變量的參數(shù)愚墓。參數(shù)將由下面討論的R腳本控制。當(dāng)然昂勉,對于由哪個文件控制的內(nèi)容有很多選擇浪册,但通常只需要少量參數(shù)。將以下內(nèi)容添加到標(biāo)題的末尾pewpoliticaltemplate.Rmd:
這會創(chuàng)建變量paramssurveywave可以從其他R會話外部控制岗照,1并2016分別給出它們的默認(rèn)值村象。設(shè)置默認(rèn)值可以讓你繼續(xù)Rmd自己編織(而不是從我們稍后會創(chuàng)建的R腳本中設(shè)置默認(rèn)值...您也可以單擊Knit并選擇Knit with Parameters指定特定值)。
現(xiàn)在對Rmd模板進(jìn)行任何更改攒至。例如厚者,在ggplot代碼中......
PA <- PA + ggtitle(paste("Presidential Approval:", params$surveywave))
請注意,我們可以獲得所有spss文件的列表迫吐,如下所示:
dir(pattern = "sav", recursive = TRUE)
[1] "http___[www.people-press.org_files_datasets_Aug16/Aug16](http://www.people-press.org_files_datasets_aug16/Aug16)public.sav"
[2] "Jan16/Jan16 public.sav"
[3] "March16/March16 public.sav"
[4] "Oct16/Oct16 public.sav"
或者在這種情況下
dir(pattern = "16 public.sav", recursive = TRUE)
[1] "http___[www.people-press.org_files_datasets_Aug16/Aug16](http://www.people-press.org_files_datasets_aug16/Aug16)public.sav"
[2] "Jan16/Jan16 public.sav"
[3] "March16/March16 public.sav"
[4] "Oct16/Oct16 public.sav"
如果您或您的協(xié)作者添加spss具有相似名稱的其他文件库菲,我建議盡可能使模式具體。要使用正則表達(dá)式指定更復(fù)雜的模式渠抹,請參見此處蝙昙。
現(xiàn)在回到編輯pewpoliticaltemplate.Rmd......
使用這些默認(rèn)設(shè)置編織文件以查看其外觀; 就是這個部分闪萄。
knitr 自動化
現(xiàn)在創(chuàng)建一個新的R腳本; 我的叫pew_report_generator.R。它只是一個簡單的循環(huán)奇颠,它告訴要抓取哪個數(shù)據(jù)集败去,以及要傳遞給的標(biāo)簽Rmd。請注意烈拒,標(biāo)簽按字母順序而不是按時間順序顯示圆裕,作為Rmd查找文件的方式的函數(shù)。
library(pacman)
p_load(knitr, rmarkdown, sessioninfo)
setwd("/users/mohanty/Desktop/pewpolitical/")
waves <- c("August 2016", "January 2016", "March 2016", "October 2016")
for (i in 1:length(waves)) {
render("pewpoliticaltemplate.Rmd", params = list(spssfile = i, surveywave = waves[i]),
output_file = paste0("Survey Analysis ", waves[i], ".pdf"))
}
session <- session_info()
save(session, file = paste0("session", format(Sys.time(), "%m%d%Y"), ".Rdata"))
而已荆几。當(dāng)然吓妆,在實(shí)踐中,您可能會在第一次調(diào)查中編寫一些代碼吨铸,但這些代碼并不適用于所有這些代碼行拢。例如,皮尤似乎在最近兩次調(diào)查中對調(diào)查日期的格式不同诞吱,這使我做了一些改變舟奠。但是,如果數(shù)據(jù)的格式相當(dāng)一致房维,那么一次性投資可以節(jié)省大量的時間沼瘫,使其容易出錯,并且容易出錯咙俩。