首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测组中的异常值和单个数据中的异常值

检测组中的异常值和单个数据中的异常值
EN

Stack Overflow用户
提问于 2015-04-28 16:02:52
回答 1查看 1K关注 0票数 0
代码语言:javascript
运行
复制
Car    100 200 300
Group1  34  35  34
Group1  57  67  34
Group1  68  76  6
Group2  45  23  23

在检测数据帧中的异常值时,我遇到了一些问题。我想要检测是否存在一个完整的向量(一行),即每个组的相应组向量(行1-3)的异常值。此外,我希望检测在特定行中是否存在异常值。对于这个问题,我找到了这个解决方案,但是使用这个代码,我必须为每一行重复整个代码,并检查表中是否有"TRUE“。有没有可能出现外部化?例如,创建所有输出的矩阵,因此我只需检查>sum(matrix==TRUE)

代码:

代码语言:javascript
运行
复制
x=as.numeric(data_without[1,1:400])
grubbs.flag <- function(x) {
     outliers <- NULL
     test <- x
     grubbs.result <- grubbs.test(test)
     pv <- grubbs.result$p.value
     while(pv < 0.05) {
         outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3]))
         test <- x[!x %in% outliers]
         grubbs.result <- grubbs.test(test)
         pv <- grubbs.result$p.value
     }
     return(data.frame(X=x,Outlier=(x %in% outliers)))
 }

grubbs.flag(x)
         X Outlier
1   0.1157   FALSE
2   0.1152   FALSE
3   0.1163   FALSE
4   0.1165   FALSE
EN

回答 1

Stack Overflow用户

发布于 2015-04-28 17:15:18

我已经阅读了对象文档,默认选项只检查是否存在给定数据的单个异常值。因此,我认为每个组只运行一次测试就足够了。

首先,按组拆分数据,然后为每个组递归执行测试。最后只返回p-value和description,看看哪个是异常值(如果有的话)-很容易识别哪个是异常值,因为它要么是最大值,要么是最小值。

代码语言:javascript
运行
复制
library(outliers)
df <- t(data.frame(car = c(100,200,300),
                 g1 = c(34,35,34),
                 g1 = c(57,67,34),
                 g1 = c(68, 76, 6),
                 g2 = c(45, 23, 23)))
row.names(df) <- c("car", "group1", "group1", "group1", "group2")

lst <- lapply(1:length(unique(row.names(df))), function(x) {
  df[row.names(df)==unique(row.names(df))[x],]
})

lst
[[1]]
[1] 100 200 300

[[2]]
[,1] [,2] [,3]
group1   34   35   34
group1   57   67   34
group1   68   76    6

[[3]]
[1] 45 23 23

lapply(lst, function(x) {
  tst <- grubbs.test(x)
  c(tst$p.value, tst$alternative)
})
[[1]]
[1] "0.5"                             "highest value 300 is an outlier"

[[2]]
[1] "0.244875529263511"            "lowest value 6 is an outlier"

[[3]]
[1] "0"                              "highest value 45 is an outlier"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29913713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档