2017-10-21 97 views
0

Donc cela donne la liste entière avec ce que je avais besoin:Obtenir la fréquence maximale que pour chaque facteur

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) 
} 

Comment puis-je obtenir la fréquence maximale pour chaque facteurs? Avec l'ensemble de diamant, je reçois

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 

Et la catégorie pour plus de clarté, mais je veux retourner ce:

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

Merci

Répondre

1

Vous devez faire un changement à votre fonction, si vous voulez l'utiliser. (Après tout, il est votre solution.)

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

Utilisez une combinaison de dplyr et tidyr verbes

Données

data <- diamonds 

Solution

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 

Sortie

# 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 

Modifier Choisir d'autres colonnes

Pour choisir d'autres colonnes, changer cette ligne select(data, cut, color, clarity). Par exemple, select(data, depth, table, price)

Pour utiliser toutes les colonnes diamonds, remplacez select(data, cut, color, clarity) %>% avec data %>%

+0

Je comptais l'utiliser dans ma fonction, il ne fonctionnera pas pour d'autres colonnes qui ne sont pas coupés, la couleur et la clarté. J'ai essayé dt_temp = data.frame (max (t (table (factorisé [, i])))) seulement pour obtenir les facteurs et la fréquence, pas la catégorie. –

+0

Je voudrais éviter les boucles autant que possible. Vous pouvez choisir d'autres colonnes si vous le souhaitez. Voir ma réponse éditée. – CPak