【发布时间】:2020-05-10 19:03:48
【问题描述】:
我构建了这个自定义的“winsorize”函数,它可以做它应该做的事情,除非数据中有 NA。
它是如何工作的:
winsor1 <- function(x, probability){
numWin <- ceiling(length(x)*probability)
# Replace first lower, then upper
x <- pmax(x, sort(x)[numWin+1])
x <- pmin(x, sort(x)[length(x)-numWin])
return(x)
}
x <- 0:10
winsor1(x, probability=0.01)
[1] 1 1 2 3 4 5 6 7 8 9 9
所以它替换了顶部(和底部)1% 的数据(四舍五入到下一个值,因为示例中只有 11 个值)。例如,如果有 250 个值,则底部 3 和顶部 3 值将分别替换为底部 4 和顶部 4。
当数据中有 NA 时,整个事情就会崩溃,从而导致错误。但是,如果我在pmax() 和pmin() 中设置na.rm = TRUE,那么NA's 本身将被底部值替换。
x[5] <- NA
winsor1(x, probability=0.01)
[1] 1 1 2 3 1 5 6 7 8 9 9
我该怎么做才能保留NA's 但不会导致错误?这是我想要的最后一行的输出:
winsor1(x, probability=0.01)
[1] 1 1 2 3 NA 5 6 7 8 9 9
【问题讨论】:
-
sort删除NA元素 (sort(c(1, 2, NA, 3))# [1] 1 2 3) 否则您必须指定na.last = TRUE> -
知道 NA 的
pmax_/pmin_在 my answer to 'Dealing with NAs when calculating... summary in group_by' 中。 -
但您的问题不在于
pmax()中的 NA 处理,而在于sort()。你期望它对 NA 做什么?sort()has optionna.last = NA/TRUE/FALSEto respectively remove/place last/first the NAs