【发布时间】:2018-03-29 17:03:37
【问题描述】:
R 精灵们下午好,
我搜索了一些关于替换数据集中异常值的帖子 - 最接近回答我的问题的两个帖子是 Changing outliers for NA in all columns in a dataset in R 和 Replace 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[] <- lapply(y, function(u) replace(u, u > Winsor75(u), Winsor75(u))) -
我的数据也有很多 NA,所以需要处理不完整的数据
标签: r