2017-08-30 1 views
-2

Il y a des centaines de niveaux dans une colonne et tous ne sont pas vraiment une valeur ajoutée - comme dans, environ 60% des niveaux représentent < 80% (ils ne se produisent pas plusieurs fois dans les données) et devrait également ne pas influencer le résultat. L'objectif est d'éliminer les niveaux qui ne contribuent pas plus de 80%. Quelqu'un pourrait-il m'aider? Merci d'avanceÉliminer les facteurs contribuant moins

+0

C'est ok à downvote - pourriez-vous s'il vous plaît ajouter des commentaires afin d'apporter des modifications? Je vous remercie. – emeralddove

+0

Que voulez-vous dire par contribution? Utilisez-vous un test statistique? Laquelle? Pouvez-vous donner un exemple reproductible? –

+0

Vous devez d'abord trouver un moyen raisonnable de repérer/spécifier les niveaux que vous souhaitez exclure. Vous pouvez le faire en fonction d'un test statistique ou en fonction de la popularité (niveaux avec très peu de lignes chacun). Ensuite, vous devriez penser si vous voulez les éliminer (vous éliminerez aussi les lignes entières) ou les recoder dans un autre niveau (par exemple "repos"). – AntoniosK

Répondre

1

Voici un processus simple qui repère les valeurs qui représentent moins de 80% de l'ensemble de données (lignes) et les regroupe en utilisant une nouvelle valeur. Ce processus utilise une colonne de caractères et non une colonne de facteur.

library(dplyr) 

# example dataset 
dt = data.frame(type = c("A","A","A","B","B","B","c","D"), 
       value = 1:8, stringsAsFactors = F) 

dt 

# type value 
# 1 A  1 
# 2 A  2 
# 3 A  3 
# 4 B  4 
# 5 B  5 
# 6 B  6 
# 7 c  7 
# 8 D  8 

# count number of rows for each type 
dt %>% count(type) 

# # A tibble: 4 x 2 
# type  n 
# <chr> <int> 
# 1  A  3 
# 2  B  3 
# 3  c  1 
# 4  D  1 

# add cumulative percentages 
dt %>% 
    count(type) %>% 
    mutate(Prc = n/sum(n), 
     CumPrc = cumsum(Prc)) 

# # A tibble: 4 x 4 
# type  n Prc CumPrc 
# <chr> <int> <dbl> <dbl> 
# 1  A  3 0.375 0.375 
# 2  B  3 0.375 0.750 
# 3  c  1 0.125 0.875 
# 4  D  1 0.125 1.000 

# pick the types you want to group together 
dt %>% 
    count(type) %>% 
    mutate(Prc = n/sum(n), 
     CumPrc = cumsum(Prc)) %>% 
    filter(CumPrc > 0.80) %>% 
    pull(type) -> types_to_group 

# group them 
dt %>% mutate(type_upd = ifelse(type %in% types_to_group, "Rest", type)) 

# type value type_upd 
# 1 A  1  A 
# 2 A  2  A 
# 3 A  3  A 
# 4 B  4  B 
# 5 B  5  B 
# 6 B  6  B 
# 7 c  7  Rest 
# 8 D  8  Rest 
+0

Merci AntoniosK - il y a bien sûr une charge cognitive dans la compréhension de la question :) – emeralddove