2017-12-28 19 views
1

Ich habe eine Funktion in R erstellt eine Tabelle zu erstellen, die eine Zählung und einen Prozentsatz ergibt:eine Tabelle in R durch Zählung Sortierung

tblFun <- function(x){ 
tbl <- table((x)) 
res <- cbind(tbl,round(prop.table(tbl)*100,0)) 
colnames(res) <- c('Count','Percentage') 
res} 

dann ausführen ich es gegen ein Feld in meinem Dataset laufen und Ausgabe mit Kable:

region <-tblFun(mtcars$mpg) 
knitr::kable(region) 

dies eine Tabelle mit dem Faktor Namen sortiert gibt, aber ich habe durch die Zählung oder Prozentsatz sortieren möchten. enter image description here

Ich habe die Sortierfunktionen ausprobiert, die ich kenne. Ich konnte nicht die tidyverse Bibliotheksfunktionen verwenden entweder, wie sie würde mir nicht den richtigen Prozentsatz:

library(dplyr) 
region <- na.omit(mtcars) %>% 
    group_by(mtcars$mpg) %>% 
    summarize(Count=n()) %>% 
    mutate(Percent = round((n()/sum(n())*100))) %>% 
    arrange(desc(Count)) 
knitr::kable(region) 

enter image description here

ein Update zu einem von ihnen würde sehr geschätzt werden.

Antwort

5

Ich reparierte gerade Ihren Code, wie unten . Sie braucht nur count statt n():

library(dplyr) 
na.omit(mtcars) %>% 
    group_by(mtcars$mpg) %>% 
    summarize(Count=n()) %>% 
    mutate(Percent = round((Count/sum(Count)*100))) %>% 
    arrange(desc(Count)) 


# A tibble: 25 x 3 
#  `mtcars$mpg` Count Percent 
#   <dbl> <int> <dbl> 
# 1   10.4  2  6 
# 2   15.2  2  6 
# 3   19.2  2  6 
# 4   21.0  2  6 
# 5   21.4  2  6 
# 6   22.8  2  6 
# 7   30.4  2  6 
# 8   13.3  1  3 
# 9   14.3  1  3 
#10   14.7  1  3 
# ... with 15 more rows 
3

Ich glaube, Sie Percent anders

library(tidyr) 
library(dplyr) 
library(knitr) 

mtcars %>% 
    drop_na %>% 
    group_by(mpg) %>% 
    summarize(
    count = n(), 
    percent = count/nrow(.) * 100 
) %>% 
    arrange(desc(count), desc(mpg)) %>% 
    head(10) %>% 
    kable 

# | mpg| count| percent| 
# |----:|-----:|-------:| 
# | 30.4|  2| 6.250| 
# | 22.8|  2| 6.250| 
# | 21.4|  2| 6.250| 
# | 21.0|  2| 6.250| 
# | 19.2|  2| 6.250| 
# | 15.2|  2| 6.250| 
# | 10.4|  2| 6.250| 
# | 33.9|  1| 3.125| 
# | 32.4|  1| 3.125| 
# | 27.3|  1| 3.125| 
+0

Ja, das für mich gearbeitet. Ich habe noch nie die Null (.) Vor – Chris

+0

@Chris gesehen, 'nrow' ist einfach die Länge des Datenrahmens und' .' ist das Pronomen für die ursprünglichen Daten, in diesem Fall 'mtcars' –

2
library('data.table') 
df1 <- data.table(mpg = mtcars$mpg) 
df1[,.(count = .N), by = mpg][, percent := prop.table(count)*100][] 
#  mpg count percent 
# 1: 21.0  2 6.250 
# 2: 22.8  2 6.250 
# 3: 21.4  2 6.250 
# 4: 18.7  1 3.125 
# 5: 18.1  1 3.125 
# 6: 14.3  1 3.125 
# 7: 24.4  1 3.125 
# 8: 19.2  2 6.250 
# 9: 17.8  1 3.125 
# 10: 16.4  1 3.125 
# 11: 17.3  1 3.125 
# 12: 15.2  2 6.250 
# 13: 10.4  2 6.250 
# 14: 14.7  1 3.125 
# 15: 32.4  1 3.125 
# 16: 30.4  2 6.250 
# 17: 33.9  1 3.125 
# 18: 21.5  1 3.125 
# 19: 15.5  1 3.125 
# 20: 13.3  1 3.125 
# 21: 27.3  1 3.125 
# 22: 26.0  1 3.125 
# 23: 15.8  1 3.125 
# 24: 19.7  1 3.125 
# 25: 15.0  1 3.125 
#  mpg count percent 

Sortierung nach Zählung oder Prozent berechnet werden soll: entweder auf- oder absteigender Reihenfolge

df1[,.(count = .N), by = mpg][, percent := prop.table(count)*100][order(count),][] 
df1[,.(count = .N), by = mpg][, percent := prop.table(count)*100][order(-count),][] 
df1[,.(count = .N), by = mpg][, percent := prop.table(count)*100][order(percent),][] 
df1[,.(count = .N), by = mpg][, percent := prop.table(count)*100][order(-percent),][] 
df1[,.(count = .N), by = mpg][, percent := prop.table(count)*100][order(count, percent),][]