Car 100 200 300
Group1 34 35 34
Group1 57 67 34
Group1 68 76 6
Group2 45 23 23
我在检测数据帧中的异常值时遇到了一些问题。我想检测每个组的相应组向量(第1-3行)是否存在完整的向量(一行)异常值。此外,我想检测一个特定行中是否有异常值。对于这个问题,我找到了这个解决方案但是使用这个代码我必须为每一行重复整个代码并检查表是否为“TRUE”。是否可以进行外科手术?例如创建所有输出的矩阵,所以我只需要检查> sum(矩阵== TRUE)
代码:
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
答案 0 :(得分:0)
我已经阅读了对象文档,默认选项只是检查是否有一个异常值给定数据。因此,我认为每组只运行一次测试就足够了。
首先按组拆分数据,然后对每个组递归测试。最后只返回p值和描述以查看哪个是离群值(如果有的话) - 它很容易识别哪个是异常值,因为它是最大值或最小值。
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"