我需要在Linux中检测并从文本文件中删除异常值,也许使用某种标准偏差?
vals.txt
57
60.95
61
66.80
74.42 <--- OUTLIER/BAD DATA
此后,我需要从列中计算平均值。
尝试输入的密码
awk '{
cnt[$1]++
val[$1] = (val[$1] ? val[$1] "," $1 : $1)
sum[$1] += $1
} END {
for (i in val) {
n = split(val[i], a, " ")
for (k=1; k<=n; k++)
if (!((sqrt((a[k] - (sum[i]/cnt[i]))^2)) < ((sum[i] / cnt[i]) * (30/100)))) {
cnt[i]--
sum[i] -= val[i]
}
}
for (i in sum)
printf "%8.5f %6.2f %6d %6.3f\n", i, sum[i], cnt[i], sum[i] / cnt[i] | "sort -nk1"
}' vals.txt
答案 0 :(得分:2)
您的问题非常模糊,因此我将假设一个离群值与整体均值超过一个标准差(其中还将排除57),并且所有非离群值的均值为最后要的那个。
(以下内容使用a re-design进行数字运算,因为我不想查找(人口)标准偏差公式并以awk的形式进行计算)
$ awk 'NR == FNR { low = $1 - $2; high = $1 + $2; next }
$1 >= low && $1 <= high { sum += $1; count += 1 }
END { print sum / count }' <(datamash mean 1 pstdev 1 < vals.txt) vals.txt
62.9167
如果这些假设是错误的,请修正您的问题以反映您使用什么作为异常值的定义,以及在给定样本数据的情况下您希望结果如何,我将适当地对其进行更新或删除。