2017-10-21 3 views
0

So gibt dieser die gesamte Liste mit dem, was ich brauchte:die maximale Frequenz nur für jeden Faktor

max <- function(x) { 
    n <- data.frame(x) 
    factored <- n[sapply(n, is.factor)] 
    dt_res = data.frame() 

    for (i in 1:ncol(factored)) { 

     dt_temp = data.frame(t(table(factored[, i]))) 
     dt_temp$Var1 = names(factored)[i] 
     dt_res = rbind(dt_res, dt_temp) 

    } 

    names(dt_res) = c("Factors", "Categories", "Frequency") 

    return(dt_res) 
} 

Wie erhalte ich die maximale Frequenz für die einzelnen Faktoren? Mit dem Diamant-Set, erhalte ich

Factors Categories Frequency 
cut  Fair  1610 
cut  Good  4906 
cut Very Good 12082 
cut  Premium 13791 
cut  Ideal  21551 
color  D   6775 
color  E   9797 
color  F   9542 
color  G  11292 
color  H  8304 
color  I  5422 
color  J  2808 

Und die Kategorie für Klarheit, aber ich will es diese zurück:

Factors Categories Frequency 
cut  Ideal  21551 
color  G  11292 
clarity SI1  13065 

Dank

Antwort

1

Sie müssen eine Änderung Ihrer Funktion machen, wenn Sie es verwenden möchten. (Schließlich ist es Ihre Lösung.)

max <- function(x){ 

    [... your code ...] 
    [... then, between 'names' and 'return' ...] 

    names(dt_res) = c("Factors", "Categories", "Frequency") 
    dt_res <- lapply(split(dt_res, dt_res$Factors), function(x) x[which.max(x$Frequency), ]) 
    dt_res <- do.call(rbind, dt_res) 
    row.names(dt_res) <- NULL 
    return(dt_res) 
} 

max(diamonds) 
# Factors Categories Frequency 
#1 clarity  SI1  13065 
#2 color   G  11292 
#3  cut  Ideal  21551 
1

Verwenden Sie eine Kombination von dplyr und tidyr Verben

Daten

data <- diamonds 

Lösung

library(dplyr) 
library(tidyr) 
select(data, cut, color, clarity) %>% # dplyr - select relevant columns 
    gather(key, value) %>%    # tidyr - gather into long format 
    group_by(key) %>%      # dplyr - group by column name 
    count(value) %>%      # dplyr - table-like function 
    top_n(1)        # dplyr - filter for top row by group 

Ausgabe

# A tibble: 3 x 3 
# Groups: key [3] 
     # key value  n 
    # <chr> <chr> <int> 
# 1 clarity SI1 13065 
# 2 color  G 11292 
# 3  cut Ideal 21551 

bearbeiten Aussuchen andere Spalten

andere Spalten zu wählen, ändern Sie diese Zeile select(data, cut, color, clarity). Zum Beispiel select(data, depth, table, price)

Um alle Spalten in diamonds verwenden, ersetzen select(data, cut, color, clarity) %>% mit data %>%

+0

Ich habe geplant, es zu benutzen, in meiner Funktion, so wird es nicht für andere Spalten arbeitet, die nicht geschnitten werden, Farbe und Klarheit. Ich habe versucht dt_temp = data.frame (max (t (table (faktorisiert [, i])))) nur um die Faktoren und Häufigkeit zu erhalten, nicht die Kategorie. –

+0

Ich würde für Schleifen wann immer möglich vermeiden. Sie können andere Spalten wählen, wenn Sie möchten. Siehe meine bearbeitete Antwort. – CPak

Verwandte Themen