【问题标题】:R function find the percentage of outliers in a column? [closed]R函数查找列中异常值的百分比? [关闭]
【发布时间】:2015-12-01 13:19:06
【问题描述】:

我需要创建一个函数来计算数据框列中异常值的百分比。对于异常值,我的意思是任何与平均值相差超过 3 个标准差的数据点。

我查看了 outlier 包,但这并没有解决我的问题,因为所有函数似乎都面向查找异常值而不是计算异常值。

有没有我可以使用的功能?

【问题讨论】:

  • 如果您注意到,这里的每个人都必须自己创建一个示例数据集才能回答您的问题。就不能自己动手做一个吗?也许也提供所需的输出?更不用说我没有看到您自己尝试过的任何东西,除了谷歌搜索“用于检测异常值 r 的软件包”。如果没有人写,你至少可以自己尝试一下。

标签: r function outliers


【解决方案1】:

我认为这个功能是你需要的:

outliersper <- function(x){
  length(which(x >  mean(x) + 3 * sd(x) | x < mean(x) - 3 * sd(x))  ) / length(x)
}

示例数据

#3 outliers here
df <- data.frame(col= c(1000,1000,1000,runif(100)))

#function
> outliersper(df$col)
[1] 0.02912621

验证

> length(which(df$col > (3 * sd(df$col))))
[1] 3
> 3/length(df$col)
[1] 0.02912621

【讨论】:

  • 谢谢@Roland。像往常一样有效的评论。我错过了这个。
  • 你很不幸mean(x &gt; 1) 在你的测试用例中给出了完全相同的结果。
【解决方案2】:

像这样,假设x 是您数据框中的一列?

set.seed(321)
x <- rnorm(10000)
x[x > mean(x) + 3*sd(x) | x < mean(x) - 3*sd(x)]
 [1]  3.135843 -3.006514  3.227549 -3.255502  3.065514  3.159309 -3.171849
 [8]  3.215432  3.120442  3.352662  3.574360  3.424063  3.126673 -3.024961
[15] -3.153842 -3.263268 -3.032526  3.179344 -3.605372

获取异常值的百分比

outli <- x[x > mean(x) + 3*sd(x) | x < mean(x) - 3*sd(x)]
length(outli) / length(x)
[1] 0.0019

并使其成为一种功能

find_outlier <- function(x, num=3) {
  mean(x > mean(x) + num*sd(x) | x < mean(x) - num*sd(x))
}


find_outlier(x)
[1] 0.0019

【讨论】:

  • mean(insert_logical_vector_here) 为您提供 TRUE 值的百分比。您可以避免在此处使用length
  • @Dason。是的,这样更好。我已经编辑了函数。感谢您的提示!
【解决方案3】:

这是dplyr 方法:

library(dplyr)

# Fake data
set.seed(54)
dat = as.data.frame(replicate(5, rnorm(10000)))

set.seed(321)
dat$ExtraCol <- rnorm(10000)

# Number of SDs to be considered an outlier
n=3

在下面的代码中,. 是一个“代词”,意思是“数据框dat 的当前列”。

# Percent outliers in every column
dat %>% 
  summarise_each(funs(sum(. > mean(.) + n*sd(.) | . < mean(.) - n*sd(.))/n()))

      V1     V2     V3     V4     V5 ExtraCol
1 0.0031 0.0039 0.0024 0.0028 0.0022   0.0019

还有多种方法可以选择特定的列。

# Columns 1, 3, and 6
dat %>% 
  summarise_each(funs(sum(. > mean(.) + n*sd(.) | . < mean(.) - n*sd(.))/n()), 
                 c(1,3,6))

      V1     V3 ExtraCol
1 0.0031 0.0024   0.0019

# Columns whose name includes "Extra"
dat %>% 
  summarise_each(funs(sum(. > mean(.) + n*sd(.) | . < mean(.) - n*sd(.))/n()), 
                 matches("Extra"))

  ExtraCol
1   0.0019

# Select only numeric columns
dat$Letters = sample(LETTERS, 10000, replace=TRUE)

dat %>% 
  summarise_each(funs(sum(. > mean(.) + n*sd(.) | . < mean(.) - n*sd(.))/n()),
                 which(sapply(., is.numeric)))

      V1     V2     V3     V4     V5 ExtraCol
1 0.0031 0.0039 0.0024 0.0028 0.0022   0.0019

【讨论】:

  • 我收到错误:summarise_each() 在 dplyr 中已弃用。请改用summarise_all()summarise_at()summarise_if()。要将funs 映射到选择的变量上,请使用summarise_at()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2021-10-18
  • 2013-08-25
  • 2019-12-05
  • 2021-10-26
相关资源
最近更新 更多