<br />
outlier.IQR <- function(x, multiple = 1.5, replace = FALSE, revalue = NA) {<br />
  q <- quantile(x, na.rm = TRUE) #四分位间距3倍间距以外的认为是离群值<br />
  IQR <- q[4] - q[2]<br />
  x1 <- which(x < q[2] - multiple * IQR | x > q[4] + multiple * IQR)<br />
  x2 <- x[x1]<br />
  if (length(x2) > 0) outlier <- data.frame(location = x1, value = x2)<br />
  else outlier <- data.frame(location = 0, value = 0)<br />
  if (replace == TRUE) {<br />
    x[x1] <- revalue<br />
  }<br />
  return(outlier)<br />
}<br />


大家帮我看看这个函数,目的是找出一个向量中的异常值。如果 replace == TRUE,则将异常值替换成 NA。但是这个函数只能找出异常值,替换没有成功。不知道哪里出了问题。

举例如下:
<br />
a <- c(1.0, 1.2, 3.0, 2.3, 1.2, 9.0)<br />
outlier.IQR(a, replace = TRUE)<br />


结果是:
<br />
  location value<br />
1        6     9<br />
> a<br />
[1] 1.0 1.2 3.0 2.3 1.2 9.0<br />


结果中异常值 9.0 并没有替换掉。
</p>

把 return(outlier)改成

print(outlier)<br />
return(x)
看看?</p>

或者是:

return(list(outlier,x))
</p>

谢谢2楼的回复,明白了。根据建议,我把函数重新写了一下:

<br />
outlier.IQR <- function(x, multiple = 1.5, replace = FALSE, revalue = NA) {<br />
  q <- quantile(x, na.rm = TRUE) #四分位间距3倍间距以外的认为是离群值<br />
  IQR <- q[4] - q[2]<br />
  x1 <- which(x < q[2] - multiple * IQR | x > q[4] + multiple * IQR)<br />
  x2 <- x[x1]<br />
  if (length(x2) > 0) outlier <- data.frame(location = x1, value = x2)<br />
  else outlier <- data.frame(location = 0, value = 0)<br />
  if (replace == TRUE) {<br />
    x[x1] <- revalue<br />
  }<br />
  return(list(new.value = x, outlier = outlier))<br />
}<br />


结果好了:
<br />
> b <- outlier.IQR(a, replace = TRUE)<br />
> b<br />
$new.value<br />
[1] 1.0 1.2 3.0 2.3 1.2  NA</p>
<p>$outlier<br />
  location value<br />
1        6     9<br />
</p>