2015-10-23 2 views
1

J'ai un jeu de données avec 17 variables, toutes entières/num. Pour une meilleure analyse descriptive j'ai créé cette fonction définie par l'utilisateur:R Erreur de fonction

sum <- function(x) 
    { 
    na.len<-sum(is.na(x)) 
    mean<-mean(x,na.rm=T) 
    sd<-sd(x,na.rm=T) 
    min<-min(x,na.rm=T) 
    q1<-quantile(x,0.25,na.rm=T) 
    q3<-quantile(x,0.75,na.rm=T) 
    max<-max(x,na.rm=T) 
    UC1=mean+3*sd 
    LC1=mean-3*sd 
    UC2=quantile(x,0.99,na.rm=T) 
    LC2=quantile(x,0.01,na.rm=T) 
    iqr=IQR(x,na.rm=T) 
    UC3=q3+1.5*iqr 
    LC3=q1-1.5*iqr 
    ot<-max>UC1 | min<LC1 | max>UC2 | min<LC2 | max>UC3 | min<LC3 
    x[x>max]<-max 
    x[x<min]<-min 
    out_exist <- ifelse(noofNA > 0, "outlier_exists", "") 
    return(c(noofNA=na.len,mean=mean,std=sd,min=min,q1=q1,q3=q3,max=max,outlier=ot, out_exists= out_exist)) 
    } 

Lorsque j'utilise cette fonction sur mon jeu de données à l'aide:

apply(df, 2, sum) 

je suis l'erreur suivante:

Error: evaluation nested too deeply: infinite recursion/ options(expressions=)? Error during wrapup: evaluation nested too deeply: infinite recursion/options(expressions=)?

I J'essaie de comprendre quel est le problème, mais en vain, s'il vous plaît aider!

+1

Si vous demandez pourquoi ce code ne fonctionne pas, il doit être inclus avec un exemple minimum reproductible. Je recommande également de diviser la fonction en petites parties et de trouver où cela ne fonctionne pas. – akrun

+3

Vous avez nommé votre fonction 'sum', puis à l'intérieur, vous appelez la fonction' sum' pour effectuer la sommation. Changez le nom de votre fonction. –

+2

Aussi, ne faites pas comme ceci 'mean <-mean (x, na.rm = T)', au lieu de nommer le résultat 'mean' essayez d'utiliser quelque chose comme ceci:' meanResult <- mean (x, na.rm = TRUE) ' – PoGibas

Répondre

0

Voici à quoi devrait ressembler votre fonction. Mais vous n'avez pas défini noofNA, donc vous aurez toujours une erreur.

details <- function(x) 
{ 
    na.len <- sum(is.na(x)) 
    m <- mean(x, na.rm=TRUE) 
    s <- sd(x, na.rm=TRUE) 
    mn <- min(x, na.rm=TRUE) 
    q1 <- quantile(x, 0.25, na.rm=TRUE) 
    q3 <- quantile(x, 0.75, na.rm=TRUE) 
    mx <- max(x, na.rm=TRUE) 
    UC1 <- m+3*s 
    LC1 <- m-3*s 
    UC2 <- quantile(x, 0.99, na.rm=TRUE) 
    LC2 <- quantile(x, 0.01, na.rm=TRUE) 
    iqr <- IQR(x, na.rm=TRUE) 
    UC3 <- q3+1.5*iqr 
    LC3 <- q1-1.5*iqr 
    ot <- mx>UC1 | mn<LC1 | mx>UC2 | mn<LC2 | mx>UC3 | mn<LC3 
    x[x>mx]<-mx 
    x[x<mn]<-mn 
    out_exist <- ifelse(noofNA > 0, "outlier_exists", "") 
    return(list(noofNA=na.len, mean=m, std=s, min=mn, q1=q1, q3=q3, max=mx, outlier=ot, out_exists= out_exist)) 
} 

set.seed(123) 
df1 <- data.frame(x = rnorm(100), y = rnorm(100)) 
sapply(df1, details)