【问题标题】:How to use IQR outlier function, based on a key, in R如何在R中使用基于键的IQR异常值函数
【发布时间】:2018-12-05 21:12:32
【问题描述】:

我想使用这个 IQR 功能:

    smooth_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.3 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- round(qnt[1] - H)
  y[x > (qnt[2] + H)] <- round(qnt[2] + H)
  y
}

在下面的df 上,在每个特定键的total 列上,基于key 列:

    key total
US4ZNB  10
US4ZNB  1075
US4ZNB  10000
US4ZNB  1138
US4ZNB  1156
US4YYM  1114
US4YYM  1072
US4YYM  50
US4YYM  1181
US4YYM  8000
JM4YYM  15000
JM4YYM  2000
JM4YYM  100
JM4YYM  2200
JM4YYM  2300

【问题讨论】:

  • 也许我不明白你的问题。如果您的数据在 df 中,则 df$smooth
  • 你是对的,我改变了df,所以现在有异常值,但我的问题是每个键都使用这个函数,所以它应该分别在3个键上工作,因为每个键都应该是不同的分布。例如对于键:US4ZNB 该函数应该对它的 5 个值起作用,并且对于每个键也是如此。

标签: r function outliers iqr


【解决方案1】:

plyr 包中的ddply 正是这样做的。它基于一列对数据的每个子集应用一个函数。

plyr::ddply(df, "key", plyr::numcolwise(smooth_outliers))

第一个参数是带有“key”和“total”的数据,第二个参数是分组变量,在本例中为“key”。

最后一个变量是你要应用的函数,numcolwise 函数在这里基本上被使用,所以它将它应用到列而不是整行。因此,我们将基于行的平滑异常值函数设为基于列的函数。

然后瞧。

您将获得一个数据框,其中列出了每个键及其 IQR,由 smooth_outliers 函数计算得出。

这是结果。

      key total
1  JM4YYM  1421
2  JM4YYM  1712
3  JM4YYM  1709
4  US4YYM  1114
5  US4YYM  1473
6  US4YYM  1181
7  US4YYM  1767
8  US4YYM  1005
9  US4ZAW  1138
10 US4ZAW  1156
11 US4ZAW  1982
12 US4ZNB  1338
13 US4ZNB  1075
14 US4ZNB  1806

如您所见,每个键都与来自 smooth_outliers 函数的输出之一匹配。

【讨论】:

  • 感谢您的提问。也许我不明白,但我仍然没有得到我需要的东西。例如我如何得到:`key total 1 US4ZNB 10-->1000+- 2 US4ZNB 1075 3 US4ZNB 1806`。我的意思是你的意思是:使基于行的平滑异常值函数成为基于列的函数。
【解决方案2】:

经过精心构思,我设法为我的问题找到了解决方案。我刚用dplyr::group_by

df.new <- df %>% group_by(key) %>% mutate(val=smooth_outliers(total))

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2015-01-23
    • 2018-03-30
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多