R Функциональная ошибка

У меня есть набор данных с 17 переменными, все они целые/число. Для лучшего описательного анализа я создал эту определяемую пользователем функцию:

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

Когда я использую эту функцию в своем наборе данных, используя:

apply(df, 2, sum)

Я получаю следующую ошибку:

Ошибка: оценка слишком глубоко вложена: бесконечная рекурсия/опции (выражения =)? Ошибка во время завершения: оценка слишком глубоко вложена: бесконечная рекурсия / параметры (выражения =)?

Пытаюсь понять в чем дело, но все тщетно, помогите пожалуйста!


person Ranjan Pandey    schedule 23.10.2015    source источник
comment
Если вы спрашиваете, почему этот код не работает, его следует включить с минимальным воспроизводимым примером. Я бы также рекомендовал разбить функцию на мелкие части и найти, где она не работает.   -  person akrun    schedule 23.10.2015
comment
Вы назвали свою функцию sum, затем внутри нее вы вызываете функцию sum для выполнения суммирования. Измените имя вашей функции.   -  person    schedule 23.10.2015
comment
Кроме того, не делайте так mean<-mean(x,na.rm=T), вместо именования результата mean попробуйте использовать что-то вроде этого: meanResult <- mean(x, na.rm = TRUE)   -  person pogibas    schedule 23.10.2015
comment
Доказательство: sum <- function(x){ sum(x) }; sum(1). Error: evaluation nested too deeply: infinite recursion / options(expressions=)?   -  person    schedule 23.10.2015
comment
Я обновил функцию:   -  person Ranjan Pandey    schedule 23.10.2015
comment
Спасибо, я понял вашу мысль и обновил функцию: sum - detail, min/max - min/max_res, mean - m, sd - std. Но я все еще получаю ту же ошибку.   -  person Ranjan Pandey    schedule 23.10.2015
comment
Что такое sum - detail, min/max...?   -  person    schedule 23.10.2015
comment
Извините, поэтому я изменил имя функции с sum на detail, а также для некоторых переменных, которые я использовал внутри функции.   -  person Ranjan Pandey    schedule 23.10.2015


Ответы (1)


Вот как должна выглядеть ваша функция. Но вы не определили noofNA, поэтому вы все равно получите сообщение об ошибке.

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)
person Community    schedule 23.10.2015