2017-07-11 2 views
-1

J'ai un gros problème ici, j'apprécierais beaucoup de l'aide. Essentiellement, j'ai un grand dataframe qui ressemble à ceci. VEUILLEZ NOTER QUE TOUT CE CODE R EST EN TERMINAL ET NON EN STUDIO!Calcul des valeurs aberrantes dans des niches spécifiques d'une base de données? [Complexe]

! [Dataframe] http://imgur.com/a/ftUZ5

Ce que je suis en train de faire est séparé du dataframe par les traitements val_lvl2 uniques.

Voici le code de ce que je veux faire, mais sur une échelle beaucoup plus grande.

Code de fonction:

remove_outliers <- function(x, na.rm = TRUE, ...) { 
    qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...) 
    H <- 1.5 * IQR(x, na.rm = na.rm) 
    y <- x 
    y[x < (qnt[1] - H)] <- NA 
    y[x > (qnt[2] + H)] <- NA 
    y 

} 

CODE:

holder1 <- subset(z_combined_cost_dtrmnt, val_lvl2 == "Hammer Toe Repair") 

holder1 <- holder1[!(holder1$episode_count <=3),] 

holder1$prd_num_of_days_num <- remove_outliers(holder1$prd_num_of_days_num) 

Cela supprimera toutes les longueurs aberrantes Hammer Repair Toe dans val_lvl2 ce qui est exactement ce que je veux. Cependant, je ne veux pas faire cette étape chaque fois car il y a pas mal de traitements uniques! Après avoir supprimé toutes les valeurs aberrantes, je dois également supprimer les colonnes NA et fusionner toutes les données dans l'unique dataframe "z_combined_cost_dtrmnt" dont toutes les longueurs aberrantes devraient maintenant être supprimées pour chaque traitement unique dans val_lvl2. À ce stade, le code ci-dessus est aussi loin que je l'ai fait avec la suppression des valeurs aberrantes, l'aide serait grandement appréciée, car je suis certain qu'il existe un moyen plus efficace de le faire, puis d'écrire ce code pour chaque traitement!

est ici chaque traitement unique en val_lvl2: [] Valeurs uniques http://imgur.com/237OqCs

Répondre

0

Vous pouvez utiliser split pour créer une liste de trames de données par niveau de val_lvl2 ...

holders <- split(z_combined_cost_dtrmnt, z_combined_cost_dtrmnt$val_lvl2) 

Et puis appliquez toutes les fonctions que vous voulez à chaque élément de cette liste en utilisant lapply, par exemple

holders <- lapply(holders, function(x) x[!x$episode_count <= 3,]) 
holders <- lapply(holders, function(x){ 
        x$prd_num_of_days_num <- remove_outliers(x$prd_num_of_days_num) 
        return(x) }) 

Vous finirez avec une liste de dataframes, un pour chaque niveau de val_lvl2.

+0

Je ne savais pas que c'était une commande! Je vous remercie! Ensuite est-ce aussi simple qu'une fusion? – nazgulian

+0

C'était exactement ce que je cherchais !!! Merci beaucoup!! Pour tous ceux qui rencontrent un problème similaire, ramener les données dans un grand ensemble est super simple! Utilisez simplement la fonction do.call. Pour moi, ça ressemblait à ça. z_combined_cost_dtrmnt <- do.call (rbind, détenteurs) – nazgulian