2015-12-22 9 views
2

Я пытаюсь создать функцию для замены выпадающих в переменной:Пользовательская функция, чтобы заменить значения в R

outlier_upper_replace <- function(x, level=1.5) { 
    lowerq = quantile(x, na.rm=TRUE)[2] 
    upperq = quantile(x, na.rm=TRUE)[4] 
    iqr = upperq - lowerq 
    outlier_upper = (iqr * level) + upperq 
    x[x > outlier_upper] <- outlier_upper 
} 

Я не могу понять, почему outlier_upper_replace(prod$varname) не заменяет значение.

Если я запускаю следующий код, который является частным случаем функции выше, значение заменяется:

level = 1.5 
lowerq = quantile(prod$varname, na.rm=TRUE)[2] 
upperq = quantile(prod$varname, na.rm=TRUE)[4] 
iqr = upperq - lowerq 
outlier_upper = (iqr * level) + upperq 
prod$varname[prod$varname > outlier_upper] <- outlier_upper 

Любые идеи о том, почему это происходит?

EDIT: Пример

set.seed(1) 
x <- rnorm(100) 
x <- c(-10, x, 10) 

boxplot(x, main="start boxplot") 

#function to bin-in upper outliers 
outlier_upper_replace <- function(x, level=1.5) { 
    lowerq = quantile(x, na.rm=TRUE)[2] 
    upperq = quantile(x, na.rm=TRUE)[4] 
    iqr = upperq - lowerq 
    outlier_upper = (iqr * level) + upperq 
    x[x > outlier_upper] <- outlier_upper 
    return(x) 
} 

outlier_upper_replace(x) 

boxplot(x, main="end boxplot") 
+0

Можете ли вы показать пример того, что вы выполняете, что не удается, мне кажется, что код, который вы дали, должен работать. – Badger

+0

Спасибо, я предоставил образец кода – myst999

ответ

2

Добавить

return(x) 

до конца вашей функции.

Возвращаемое значение функции R является результатом последнего выражения в теле функции. Поскольку вы изменяете вектор в последнем выражении, результата нет, и вы должны явно вернуть результат.

+0

Спасибо, я пробовал это, но безрезультатно. – myst999

+0

@ myst999, вы, кажется, не понимаете, как работают функции. Когда вы запускаете свою функцию, вам нужно переназначить вывод или назначить его другому объекту. Попробуйте 'y <- outlier_upper_replace (x); boxplot (y) 'или' boxplot (outlier_upper_replace (x)) ', если вы не хотите создавать другой объект. – A5C1D2H2I1M1N2O1R2T1

Смежные вопросы