Удалить значение выброса из текстового файла - PullRequest
0 голосов
/ 22 апреля 2019

Мне нужно обнаружить и удалить выброс из текстового файла в 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

1 Ответ

2 голосов
/ 22 апреля 2019

Ваш вопрос довольно расплывчатый, поэтому я собираюсь сделать предположение, что выброс является более чем одним стандартным отклонением от общего среднего значения (которое также исключает 57), и что среднее значение всех неучастных значений равно тот, который вы хотите в конце.

(Следующее использует GNU datamash для вычисления числа, потому что мне не хочется искать формулу стандартного отклонения (совокупности) и вычислять ее в 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

Если эти предположения неверны, исправьте ваш вопрос, чтобы отразить то, что вы используете в качестве определения выброса, и как вы хотите, чтобы результаты выглядели, учитывая данные примера, и я обновлю или удалю это по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...