使用RMarkdown自動化調(diào)查摘要

本指南介紹了如何使用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ì)信息插入到文本中,如下所示:


image.png

該模板包含具有調(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
image.png

以下是加權(quán)交叉表的示例。knitr::kable將創(chuàng)建一個專業(yè)的表格(當(dāng)編織時PDF; kable采用學(xué)術(shù)期刊的風(fēng)格)香府。
kable(wtd.table(surveyideo, surveysex, survey$weight)/nrow(survey), digits = 2)

image.png

假設(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"))
image.png

假設(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:

image.png

這會創(chuàng)建變量paramsspssfile并且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......


image.png

使用這些默認(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é)省大量的時間沼瘫,使其容易出錯,并且容易出錯咙俩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耿戚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阿趁,更是在濱河造成了極大的恐慌膜蛔,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歌焦,死亡現(xiàn)場離奇詭異飞几,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)独撇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁锁,“玉大人纷铣,你說我怎么就攤上這事≌阶” “怎么了搜立?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長槐秧。 經(jīng)常有香客問我啄踊,道長忧设,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任颠通,我火速辦了婚禮址晕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顿锰。我一直安慰自己谨垃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布硼控。 她就那樣靜靜地躺著刘陶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牢撼。 梳的紋絲不亂的頭發(fā)上匙隔,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音熏版,去河邊找鬼牡直。 笑死,一個胖子當(dāng)著我的面吹牛纳决,可吹牛的內(nèi)容都是我干的碰逸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼阔加,長吁一口氣:“原來是場噩夢啊……” “哼饵史!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胜榔,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤胳喷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后夭织,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吭露,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年尊惰,在試婚紗的時候發(fā)現(xiàn)自己被綠了讲竿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡弄屡,死狀恐怖题禀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膀捷,我是刑警寧澤迈嘹,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響秀仲,放射性物質(zhì)發(fā)生泄漏融痛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一神僵、第九天 我趴在偏房一處隱蔽的房頂上張望雁刷。 院中可真熱鬧,春花似錦挑豌、人聲如沸安券。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侯勉。三九已至,卻和暖如春铝阐,著一層夾襖步出監(jiān)牢的瞬間址貌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工徘键, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留练对,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓吹害,卻偏偏與公主長得像螟凭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子它呀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容