【问题标题】:R: pmax() function to ignore NA's?R: pmax() 函数忽略 NA 的?
【发布时间】: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

【问题讨论】:

标签: r na


【解决方案1】:

问题在于sort,因为它默认删除了NA,否则我们必须指定na.last = TRUE,这也可能不是我们需要的情况。一种选择是order

winsor1 <- function(x, probability){

  numWin <- ceiling(length(x)*probability)

  # Replace first lower, then upper
  x1 <- x[order(x)]
  x <- pmax(x, x1[numWin+1])
  x1 <- x1[order(x1)]
  x <- pmin(x, x1[length(x)-numWin], na.rm = TRUE)

  return(x)
}

-测试

x <- 0:10
winsor1(x, probability=0.01)
#[1] 1 1 2 3 4 5 6 7 8 9 9

x[5] <- NA 
winsor1(x, probability=0.01)
#[1]  1  1  2  3 NA  5  6  7  8  9 10

或在sort 中使用na.last

winsor1 <- function(x, probability){

  numWin <- ceiling(length(x)*probability)

  # Replace first lower, then upper
  x <- pmax(x, sort(x, na.last = TRUE)[numWin+1])
  x <- pmin(x, sort(x, na.last = TRUE)[length(x)-numWin], na.rm = TRUE)

  return(x)
}

【讨论】:

  • 谢谢,很高兴知道 sort 删除了 NA。但是,如果我执行 x[2:3]
  • @Joef 的预期输出是什么
  • 如果我使用你的最后一个函数,输出都是 NA。所需的输出是 3, NA, NA, 3, 4, 5, 6, 7, 8, 9, 9
  • 在当前函数中,length(x)- numWin返回的索引为10,即NAsorted值,可以在pmin中指定na.rm = TRUE
  • 是的,行得通!谢谢你。我的另一个同样有效的解决方案是x &lt;- pmin(x, sort(x, na.last = TRUE)[length(x)-numWin-sum(is.na(x))])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
相关资源
最近更新 更多