【发布时间】:2020-07-14 14:23:25
【问题描述】:
我是 R 的新手,但在删除一些异常值时遇到了问题。我有一个类似这样的数据框:
Item1 Item2 Item3
4.05 3.9 3.6
12 3.7 4
4.01 3.8 4
我想要的结果应该类似于下表,即每列的异常值都被删除的表
Item1 Item2 Item3
4.05 3.9 3.6
NA 3.7 4
4.01 3.8 4
到目前为止,我已经编写了一个可以检测异常值的代码,但我坚持要删除它们,因为整个列都发生了变化,而不是单个值。
find_outlier <- function(log_reaction_time) {
media <- mean(log_reaction_time)
devst <- sd(log_reaction_time)
result <-which(log_reaction_time < media - 2 * devst | log_reaction_time > media + 2 * devst)
log_reaction_time2 <- ifelse (log_reaction_time %in% result, NA, log_reaction_time)
}
apply(log_reaction_time, 2, find_outlier)
我想问题出在我将函数应用于列 (2) 的事实,因为我想找到列的异常值,但我只想删除相关值...
【问题讨论】:
-
问题是你如何定义异常值,如果你使用分位数和IQR,你的第一列没有异常值。
-
我没有使用分位数,而是删除了平均值 +/- 2 标准差之外的每个值。我认为我找到的代码可以正确检测异常值,我只想删除单元格而不是整个列。不过谢谢!
-
而
log_reaction_time位于此数据框之外? -
log_reaction_time 是数据帧的名称。所以我的想法是:我将函数定义为应用于 df,然后将其应用于不同的列。
-
我很困惑 mean(log_reaction_time) 是每个条目的平均值还是一列的平均值?