Чтобы решить проблему длины, используйте ifelse
, чтобы вы знали, что создадите новый вектор такой же длины, что и исходный x
. Кроме того, в сложных условиях попробуйте разбить их на более мелкие кусочки. Если вы не уверены на 100% в порядке операций, легко ошибиться, и я не уверен, что ваша текущая логика делает то, что вы хотите:
outlier <- function(x) {
lower_limit = quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE)
upper_limit = quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE)
is_outlier = (x < lower_limit) | (x > upper_limit)
print(paste("Replacing", sum(is_outlier), "outliers"))
ifelse(
is_outlier,
x * 0.7,
x
)
}