我的代码
dat <- read.csv("numeric.csv")
dat1 <- na.omit(dat)
##Function to calculate outliers
FindOutliers <- function(data) {
lowerq = quantile(data)[2]
upperq = quantile(data)[4]
iqr = upperq - lowerq #Or use IQR(data)
# we identify extreme outliers
extreme.threshold.upper = (iqr * 3) + upperq
extreme.threshold.lower = lowerq - (iqr * 3)
result <- which(data > extreme.threshold.upper | data < extreme.threshold.lower)
}
out_dat <- names(dat1)
out_dat <- as.data.frame(out_dat)
for (dat in seq_along(dat1)){
temp <- FindOutliers(dat)
out_dat$outlier_count <- length(temp)
}
如果分别传递每一列,但通过传递整个数据框,则能够得出异常值。
样本数据集
df <- read.table(text = "
var1 var2 var3 var4 var5 var6 var7
a 1 1 10 10 1 1 1
b 10 1 1 1 1 1 851
c 1 1 1 1 1 1 158
d 1 1011 1 1 1 5 1
e 1 1 55 1 9 1 1
f 1 1 1 1 1 781 1
", header = TRUE)
答案 0 :(得分:1)
您可以通过Apply来做到这一点。
FindOutliers <- function(data) {
lowerq = quantile(data)[2]
upperq = quantile(data)[4]
iqr = upperq - lowerq #Or use IQR(data)
# we identify extreme outliers
extreme.threshold.upper = (iqr * 3) + upperq
extreme.threshold.lower = lowerq - (iqr * 3)
result <- which(data > extreme.threshold.upper | data < extreme.threshold.lower)
length(result)
}
apply(df, 2, FindOutliers)
答案 1 :(得分:1)
要获取离群值的位置索引(每列):
"Capabilities - Send and receive instant messages and photos"
要获取离群数(每列):
pos <- lapply(df, FindOutliers)
使用小样本量不是一个好主意。假设您的示例lengths(pos)
的样本量为6,在最后一列中仅检测到851作为离群值,而没有选择158。