使用apply在自定义winsorization函数中保留NA

时间:2017-05-18 15:51:59

标签: r

我正在尝试使用大量NA条目来优化数据帧,并且我需要在winsorization之后保留NA条目。数据帧中的列需要在较低端进行精细化(即小值),但在上端需要一些winsorization(即大值)。我已经创建了一个几乎可以完成工作的函数,但我似乎无法使函数返回它们出现的NA条目。
这是一个例子。

# vector with an NA entry & upper-end value needs winsorization
a <- c(1:3,NA,90) 

# my function
winsor <- function(x)
{ y <- quantile(x,probs=.95,na.rm=T)
sapply(x, function(x) {
if ( x>=y ){
x <- y
}
else { x <- x}
})

# returned vector after apply winsor to my object, a.
z <- as.data.frame(winsor(a))

执行此操作时得到的结果会出现以下错误:

  

if(x&gt; = y){:缺少值需要TRUE / FALSE时出错

但它仍会返回以下向量(这就是我想要的,期望它不会根据需要返回NA条目)。

a
1.000
2.000
3.000
85.824

将非常感谢任何帮助,以及将此功能操作到整个数据框的扩展。希望这一切都有意义。这是我的第一篇文章(希望我的例子可以重现!)。

1 个答案:

答案 0 :(得分:0)

winsor函数最终需要}。我冒昧地调整了代码:

winsor <- function(x){ 
  y <- quantile(x,probs=.95,na.rm=T)
  sapply(x, function(x) {
   if(!is.na(x)){
      if(x>=y ){
       x <- y
    }
     else { x <- x}
  }
 }) 
}

z<-data.frame(winsor=as.numeric(unlist(winsor(a))))