2014-11-13 44 views
1

個別HTML文件說我有,每組多行高大的數據幀,就像這樣:拆分一個數據幀由組和印刷組特定的行使用奉迎和融洽

df <- data.frame(group = factor(rep(c("a","b","c"), each = 5)), 
       v1 = sample(1:100, 15, replace = TRUE), 
       v2 = sample(1:100, 15, replace = TRUE), 
       v3 = sample(1:100, 15, replace = TRUE)) 

我想要做的就是拆分成df單獨length(levels(df$group)) dataframes,例如,

df_a <- df[df$group=="a",]; df_b <- df[df$group == "b",] ; ...

,然後打印在一個單獨的HTML/PDF/DOCX文件(每個數據幀可能使用Rmarkdownknitr)。

我想這樣做,因爲我有一個大的數據框,並希望爲每個組創建一個個性化的報告a,b,c,等謝謝。

更新(14年11月18日)

繼此線程和another thread @daroczig的意見,我試圖讓我自己的模板,將只打印所有列和行的一個很好的格式化表格每組替換原始sapply()函數中的"correlations"模板調用。我想製作自己的模板,而不是僅僅打印漂亮的表格(例如,@Thomas慷慨提供的答案),因爲我希望在簡單打印工作後在模板中構建額外的自定義。無論如何,我當然宰殺它:

<!--head 
meta: 
    title: Sample Report 
    author: Nicapyke 
    description: This is a demo 
    packages: ~ 
inputs: 
- name: eachgroup 
    class: character 
    standalone: TRUE 
    required: TRUE 
head--> 

### Records received up to present for Group <%= eachgroup %> 

<%= 
pandoc.table(df[df$group == eachgroup, ]) 
%> 

然後保存,作爲在我的工作目錄groupreport.rapport,我寫了下面的R代碼裏面,@ daroczig的響應後,仿照:

allgroups <- unique(df$group) 

library(rapport) 


for (eachstate in allstates) { 
    rapport.docx("FILEPATHHERE", eachgroup = eachgroup) 
} 

我收到錯誤:

Error in openFileInOS(f.out) : File not found! 

我不知道發生了什麼事。我從pander文檔看到,這意味着它正在尋找一個系統文件,但這對我來說沒有多大意義。無論如何,這個錯誤不會在問題的根源,這是1)我應該在自定義模板YAML頭的input部分去拿,和2),其中R代碼應該在rapport模板與走在R腳本。

我意識到我可能會犯一些錯誤,這些錯誤揭示了我對rapportpander缺乏經驗。謝謝你的耐心!

N.B:

> sessionInfo() 
R version 3.1.2 (2014-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] knitr_1.8  dplyr_0.3.0.2 rapport_0.51 yaml_2.1.13  pander_0.5.1 
plyr_1.8.1   lattice_0.20-29 

loaded via a namespace (and not attached): 
[1] assertthat_0.1 DBI_0.3.1  digest_0.6.4 evaluate_0.5.5 formatR_1.0 grid_3.1.2  
[7] lazyeval_0.1.9 magrittr_1.0.1 parallel_3.1.2 Rcpp_0.11.3 reshape_0.8.5 stringr_0.6.2 
[13] tools_3.1.2 

回答

2

稍微偏離主題,但仍R /降價單行用於與報告模板單獨的報告:

> library(rapport) 
> sapply(levels(df$group), function(g) rapport.html('correlations', data = df[df$group == g, ], vars = c('v1', 'v2', 'v3'))) 
Exported to */tmp/RtmpYyRLjf/rapport-correlations-1-0.[md|html]* under 0.683 seconds. 
Exported to */tmp/RtmpYyRLjf/rapport-correlations-2-0.[md|html]* under 0.888 seconds. 
Exported to */tmp/RtmpYyRLjf/rapport-correlations-3-0.[md|html]* under 1.063 seconds. 

rapport包可以在任何(分)的數據集運行(預定義或定製)的報告模板在markdown中,然後將其導出爲HTML/docx/PDF /其他格式。對於一個快速演示,我已上載的結果文檔:

+0

謝謝@daroczig。這可能是我所尋找的更多。在你能創建一個簡單的自定義模板之前,你會說你花了多少時間來學習'markdown'語法和'關係'語法? – mcjudd

+1

@Nicapyke降價很容易,最重要的事情可以在5分鐘內學會生活。對於更復雜的東西,你絕對應該閱讀[Pandoc的降價手冊](http://johnmacfarlane.net/pandoc/README.html#pandocs-markdown),但是沒有必要手動創建它們,因爲[pander軟件包]( http://rapporter.github.io/pander/)可以自動從原始R對象爲你做到這一點。關於'關係':我是其中一位作者,所以我的看法是片面的:)但它不應該比學習'降價'花費更多。如果您遇到困難,請隨時聯繫我。 – daroczig

+0

感謝您的回覆,@daroczig。我做了一些更多的衝浪,所以找到了你在這裏的回覆:http://stackoverflow.com/questions/25407307/how-to-produce-markdown-document-for-each-row-of-dataframe-in-我認爲這更符合我想要做的事情(當然,每個數據幀除外)。如果我有任何問題,我會執行並讓你知道。再次感謝。 – mcjudd

1

你可以用by(或split)和xtable(從xtable包)做到這一點。在這裏,我創建的每個子集的xtable對象,然後在他們循環才能打印到文件:

library('xtable') 
s <- by(df, df$group, xtable) 
for(i in seq_along(s)) print(s[[i]], file = paste0('df',names(s)[i],'.tex')) 

如果使用斯塔蓋澤包,你可以得到的數據框,而不是數據框本身的一個很好的總結只需一行:

library('stargazer') 
by(df, df$group, stargazer, out = paste0('df',unique(df$group),'.tex')) 

您應該能夠輕鬆地將這些文件包含在例如PDF報告中。您也可以使用HTML標記使用xtablestargazer

+0

感謝這個答案,@Thomas。我不熟悉LaTeX。我的工作電腦上安裝了MiKTeX 2.9。從.tex代碼創建輸出就像將文件加載到MiKTeX並讓解釋器評估和打印格式正確的表一樣簡單?謝謝。 – mcjudd

+1

LaTeX是Rstudio用來從Rmd文件創建PDF的內容。 MikTeX基本上是LaTeX的一個實現。上面的例子幾乎可以工作。一個基本的LaTeX教程將告訴你如何將這些表格嵌入到一個簡單的文檔中。 – Thomas

+0

謝謝,我會跟進。另外,如何專注於編程的某個方面,然後從未意識到從一開始就可以使用某些非常基本的功能,這很有趣。 'split',這裏就是一個完美的例子。 「plyr」和「dplyr」已經將我從基地R屏蔽了起來,無論好壞。 :) – mcjudd