【问题标题】:How to detect and remove outliers within loop in R?如何检测和删除R循环内的异常值?
【发布时间】:2020-10-12 03:54:44
【问题描述】:

希望有人可以为绝望的学生提供帮助 :-) 我有一组程序代码,我有不同数量的手术(这里:程序)以及它们各自的持续时间。我想获得一些关于持续时间的描述性统计数据。为此,我希望我的循环已经通过 IQR 函数检测和删除异常值。这是没有异常检测和删除的代码:

# 输出变量 - 在每个循环之前运行 计数器0TimeIn_2_S) { Start_Time

这是我希望通过特定过程添加到循环中的内容:

Q<-quantile(Duration, probs=c(.25,.75), na.rm=FALSE)
iqr<-IQR(Duration)
up<-Q[2]+1.5*iqr
low<-Q[1]-1.5*iqr
remove<-Duration>(Q[1]-1.5*iqr) & Durations<(Q[1]-1.5*iqr)
setdiff(Duration, remove)

有人知道我该怎么做吗?

非常感谢您!

【问题讨论】:

  • 您好 :) 请考虑尝试提出您的问题reproducible 这将大大增加您获得答案的机会。那么,R中的循环不是推荐的做法,你试过apply()lapply()等吗?在这种情况下,我将创建自定义函数(或在其他 R 包中查找现有函数),然后将其应用于我的数据集。请注意,进入这种apply 心态可能会帮助您使您的示例具有可重复性。
  • 另外,this 可能包含一些想法。
  • 谢谢,保罗,会的!

标签: r loops outliers iqr


【解决方案1】:

让它成为一个函数?

f.remove_outliers_IQR <- function(Duration)
{
Q <- quantile(Duration, probs=c(.25,.75), na.rm=FALSE)
iqr <- IQR(Duration)
up <- Q[2]+1.5*iqr
low <- Q[1]-1.5*iqr
remove <- Duration>(Q[1]-1.5*iqr) & Durations<(Q[1]-1.5*iqr)
Duration_out <- setdiff(Duration, remove)
return(Duration_out)
}

并在主循环中调用它,可能就在Counter1&lt;-Counter1+1之前?

【讨论】:

  • 那么我需要在 Counter1
  • 我了解您的代码计算 Duration 并且您希望在限定您的程序之前删除 Duration 的异常值。如果这是正确的,那么您应该在 Duration 上运行 Duration&lt;-difftime(TimeOut_Selected, Start_Time, units = "mins") 行之后的 IQR 测试。至少我是这样解释你的代码的
  • 好的,谢谢。不幸的是,由于某种原因它不起作用。我需要将Min_Time&lt;-min(Durations, na.rm=TRUE)更改为Min_Time&lt;-min(Duration_out, na.rm=TRUE)吗?抱歉,实际上我以前从未使用过函数...我也刚刚尝试过Duration[!Duration %in% boxplot.stats(Duration)$out],但结果值仍然包括异常值。
  • 抱歉,刚刚识别:嗯,我用的是Durations&lt;-c(Durations, Duration),所以我需要把它改成Durations&lt;-c(Durations, Duration_out)吗?
  • 是的,或者你打电话给Duration &lt;- f.remove_outliers_IQR(Duration)。如果没有可重复的例子,总是很难给出建议。在您的情况下,我假设您的代码已被检查,并且异常值检测方法按您的预期工作。例如,函数的 ruturn 可以是NA?注意setdiff(Duration, remove)setdiff(remove, Duration)不一样(见rdocumentation.org/packages/prob/versions/1.0-1/topics/setdiff
猜你喜欢
  • 2017-09-25
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2018-10-16
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多