2016-11-06 131 views
1

我想知道是否有一種更有效的方式來獲取包括總計彙總表。 我在這裏做了四個步驟。如何獲得彙總表總計表

data<-iris %>% group_by(Species) %>% 
    summarise(
    Sepal.Len = paste(format(round(median(Sepal.Length),2),nsmall=2)), 
     P.len = paste(format(round(median(Petal.Length),2),nsmall=2)) , 
      counts=n()) 
datatotal<-iris %>% group_by(.) %>% 
    summarize(
    Sepal.Len = paste(format(round(median(Sepal.Length),2),nsmall=2)), 
    P.len = paste(format(round(median(Petal.Length),2),nsmall=2)) , 
    counts=n()) 
datatotal<-cbind(Species="Total",datatotal) 
final<-rbind(data,datatotal) 
final 
# A tibble: 4 × 4 
    Species Sepal.Len P.len counts 
*  <fctr>  <chr> <chr> <int> 
1  setosa  5.00 1.50  50 
2 versicolor  5.90 4.35  50 
3 virginica  6.50 5.55  50 
4  Total  5.80 4.35 150 

回答

2

上@理查德的答案在一切都在進一步改善一個鏈:

iris %>% 
    group_by(Species) %>% 
    summarise(
    Sepal.Len = median(Sepal.Length), 
    P.len = median(Petal.Length) , 
    counts = n() 
) %>% 
    bind_rows(., iris %>% 
       summarize(
       Sepal.Len = median(Sepal.Length), 
       P.len = median(Petal.Length) , 
       counts = n() 
      ) %>% 
       mutate(Species = "Total") 
      ) %>% 
    mutate_each(funs(format(., nsmall = 2, digits = 2)), 2:3) 

結果:

# A tibble: 4 × 4 
    Species Sepal.Len P.len counts 
     <chr>  <chr> <chr> <int> 
1  setosa  5.00 1.50  50 
2 versicolor  5.90 4.35  50 
3 virginica  6.50 5.55  50 
4  Total  5.80 4.35 150 

另一種方法是使用dcastmargins參數從reshape2包:

dcast(transform(melt(iris, id.vars = 'Species', measure.vars = c('Sepal.Length','Petal.Length')), 
       counts = ave(value, variable, Species, FUN = length)), 
     Species + counts ~ variable, 
     fun.aggregate = median, 
     margins = 'Species') 

結果(不幸的是沒有精確描述):

 Species counts Sepal.Length Petal.Length 
1  setosa  50   5.0   1.50 
2 versicolor  50   5.9   4.35 
3 virginica  50   6.5   5.55 
4  (all) (all)   5.8   4.35 
1

您可以簡化代碼,通過格式化移動到最終目標等,但不會讓它更快

data <- iris %>% group_by(Species) %>% 
    summarise(
    Sepal.Len = median(Sepal.Length), 
    P.len = median(Petal.Length) , 
    counts = n() 
) 

datatotal <- iris %>% 
    summarize(
    Sepal.Len = median(Sepal.Length), 
    P.len = median(Petal.Length) , 
    counts = n() 
) %>% 
    mutate(Species = "Total") 

final <- rbind(data, datatotal) 
format(final, nsmall = 2, digits = 2)