2016-09-03 62 views
6

Sıklıkla kendimi dplyr kullanarak R'de özet istatistiklerini hesaplarken buluyorum ve daha sonra tableau'nun tabloları çok basit ve kolay olduğu için bir tablo oluşturmak için sonucu csv'ye yazıp tableau'ya yüklüyorum. Tabloları doğrudan doğruya üretmek istiyorum.Tablo görünümünde R için işaretleme

R? De gruplandırılmış tablolar için kolay bir çözüm var mı? Şimdi

library(tidyr) 
library(dplyr) 

summary_table <- iris %>% 
    gather(measure, value, -Species) %>% 
    separate(measure, into=c("attribute", "dimension")) %>% 
    group_by(Species, attribute, dimension) %>% 
    summarise(mean=mean(value)) 

summary_table 

Source: local data frame [12 x 4] 
Groups: Species, attribute [?] 

     Species attribute dimension mean 
     <fctr>  <chr>  <chr> <dbl> 
1  setosa  Petal Length 1.462 
2  setosa  Petal  Width 0.246 
3  setosa  Sepal Length 5.006 
4  setosa  Sepal  Width 3.428 
5 versicolor  Petal Length 4.260 
6 versicolor  Petal  Width 1.326 
7 versicolor  Sepal Length 5.936 
8 versicolor  Sepal  Width 2.770 
9 virginica  Petal Length 5.552 
10 virginica  Petal  Width 2.026 
11 virginica  Sepal Length 6.588 
12 virginica  Sepal  Width 2.974 

ben bu sunmak istiyorum:

Ben isteyeyim verilerini oluşturmak çok kolay

enter image description here

farklı birkaç denemek isterdim

organize etme yolları, bu yüzden sütunlar yerine satırlar üzerinde kolayca gruplamak istiyorum. grouped rows

gruplandırılmış satırlar versiyonunun

temel özellikleri şunlardır:

  • gruplandırma değişken sıralar
  • Yatay hücre tüm yayılan bir hücrede değil, ayrı bir satırda daha ayrı bir sütunda, solda Grup düzeyindeki sınırlar

Rmarkdown'a yeniyim, ancak en büyük hedef bunu bir html belgesine sahip olmaktır.

Bu mümkün mü?

+0

Siz de kendi başınıza toplamaları yapıyor düşünebilirsiniz. Ben topladım (x = iris [, colnames (iris) [colnames (iris)! = "Türler"]], = liste (iris $ Türler), FUN = işlev (y) {ifelse (is.numerik (y), bir başlangıç ​​için ortalama (y), NA)} ) '. – nilsole

cevap

4

htmlTable paketini kullanarak tabloların her birini oluşturmak için yollar vardır. Türler arasında yatay çizgiler nasıl ekleneceğinden emin değildim, ancak zebra gölgeleme ekledim. İşte

--- 
title: "<h3>Untitled</h3>" 
author: "Author" 
date: "September 3, 2016" 
output: html_document 
--- 

```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = FALSE, message=FALSE, warning=FALSE) 
``` 

```{r} 
library(tidyr) 
library(dplyr) 
library(reshape2) 
library(htmlTable) 
``` 

```{r} 
st = iris %>% 
    gather(measure, value, -Species) %>% 
    separate(measure, into=c("attribute", "dimension")) %>% 
    group_by(Species, attribute, dimension) %>% 
    summarise(mean=mean(value)) %>% 
    spread(dimension, mean) 

# Keep only first value of outer grouping column 
st = st %>% 
    group_by(Species) %>% 
    mutate(count=1:n()) %>% 
    ungroup %>% 
    mutate(Species = ifelse(count==1, as.character(Species), NA)) %>% 
    select(-count) 

# Remove names of grouping columns 
names(st)[1:2] = "" 

# Round numeric columns to two decimal places 
st[,sapply(st,is.numeric)] = sapply(st[,sapply(st,is.numeric)], function(x) sprintf("%1.2f",x)) 

htmlTable(st, rnames=FALSE, align="llrr", align.header="llrr", 
      col.rgroup = rep(c("none", "gray93"), each=2), 
      css.cell = c("padding-left: 0em","padding-left: 1em",rep("padding-left: 2em",2))) 
``` 
```{r} 
# Another option 
htmlTable(st[,-1], rnames=FALSE, align="llrr", align.header="lrr", 
      n.rgroup=rep(2,3), 
      rgroup=rep(unique(iris$Species),2), 
      #col.rgroup = c("none","gray93"), # If you want to add alternating shading 
      css.cell=c("padding-left: 0.5em","padding-left: 4em","padding-left: 1.5em")) 
``` 

```{r} 
st = iris %>% 
    melt(id.var="Species") %>% 
    group_by(Species, variable) %>% 
    summarise(mean=mean(value)) %>% 
    dcast(Species ~ variable) 
names(st)[1] = "" 

# Round numeric columns to two decimal places 
st[,sapply(st,is.numeric)] = sapply(st[,sapply(st,is.numeric)], function(x) sprintf("%1.2f",x)) 

# Set up grouping columns and column names 
group_col = gsub("(.*)\\..*", "\\1", names(st)) 
group_col = factor(group_col, levels=unique(group_col)) 
names(st) = gsub(".*\\.", "", names(st)) 

htmlTable(st, rnames=FALSE, align="lrrrr", 
      align.header="lrrrr", 
      cgroup=unique(group_col), n.cgroup=unclass(table(group_col)), 
      css.cell = c("padding-left: 0em","padding-left: 1.5em", rep("padding-left: 2em",3))) 
``` 

çıkışı var:

İşte belge var

enter image description here