【问题标题】:Replacing Defined Outliers Using Apply/Tapply R使用 Apply/Tapply R 替换定义的异常值
【发布时间】:2018-03-29 17:03:37
【问题描述】:

R 精灵们下午好,

我搜索了一些关于替换数据集中异常值的帖子 - 最接近回答我的问题的两个帖子是 Changing outliers for NA in all columns in a dataset in RReplace outliers by quantiles in R

如果您想更新一两列,第二个参考中的代码非常有用,但我有 40 多个,并且希望能够使用 apply 函数一次点击所有列。

我想为每列设置分位数阈值“max”(probs = .75),并将任何 x>“max”替换为“max”

set.seed(1)
x = matrix(rnorm(20), ncol = 2)
x[2, 1] = 100
x[4, 2] = 200
colnames(x) <- c("a","b")
#apply(x,2,quantile,probs = .75)

Winsor75 <- function(x) {
  Max <- quantile(x, probs = .75)

    return(Max)
}
y <- as.data.frame(x)

y$a[y$a > Winsor75(x)] <- Winsor75(x)

最后一行代码有效地替换了任何已定义的异常值(在我的情况下值高于 75%),但将 75% 用于整个矩阵“x”,其中我希望 (a) 分位数可归因于每一列以及 (b) 在 apply/tapply 等中使用该功能的能力,以便我可以有效地对所有列执行操作。

有什么建议吗?

谢谢!

【问题讨论】:

  • 使用lapply,即y[] &lt;- lapply(y, function(u) replace(u, u &gt; Winsor75(u), Winsor75(u)))
  • 我的数据也有很多 NA,所以需要处理不完整的数据

标签: r


【解决方案1】:
as.data.frame(lapply(y, function(x) pmin(x, quantile(x, 0.75, na.rm = TRUE))))

作为一个函数:

df_winsor <- function(df, p) {
  as.data.frame(lapply(df, 
                       function(x) pmin(x, quantile(x, probs = p, na.rm = TRUE))))
} 

统计学家的免责声明:我已经解决了您提出的编程问题。这不应被视为对自动检查或处理所谓的“异常值”的想法的认可。

【讨论】:

  • 支持免责声明。强烈同意。
【解决方案2】:

一种选择是将mutate_allcustom 函数一起使用,并将规则应用于所有列。

方法:

我已经创建了一个 replaceOutlier 函数(基于 OPs function) which calculatesMaxand then replaces any item which is more thanMaxbefore returning vector.replaceOutlieris applied over all columns usingdplyr::mutate_all`。

library(tidyverse)

replaceOutlier <- function(x) {
  Max <- quantile(x, probs = .75)
  x[x>Max] <- Max
  return(x)
}

x %>% as_tibble() %>% mutate_all(funs(replaceOutlier))

#Results
# # A tibble: 10 x 2
#     a       b
#   <dbl>   <dbl>
# 1 -0.626  1.08  
# 2  0.698  0.390 
# 3 -0.836 -0.621 
# 4  0.698  1.08  
# 5  0.330  1.08  
# 6 -0.820 -0.0449
# 7  0.487 -0.0162
# 8  0.698  0.944 
# 9  0.576  0.821 
# 10 -0.305  0.594 
# 

数据

set.seed(1)
x = matrix(rnorm(20), ncol = 2)
x[2, 1] = 100
x[4, 2] = 200
colnames(x) <- c("a","b")

【讨论】:

  • 谢谢大家,感谢您的回复
  • @ALMDude 欢迎您。感谢您为提供详细信息和问题所做的努力。您也可以通过单击答案左侧的tick 符号来接受答案。这样对未来的用户会有帮助。
  • 没问题,所有答案都适用于我可以运行的答案,由于某种原因,我在包方面遇到了 tidyverse/dplyr/pillar 问题,并且无法测试您的选择 - 看起来很灵活和可行的选择!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多