Вычислите среднее значение для столбца и скажите, ли это значение “в порядке” или “ОШИБКА”, если находится в пределах допустимого диапазона

perl -ane 'print if($F[3] =~ /^\w,\w/$);' file

-n говорит жемчугу обрабатывать infile одна строка во время, передавая каждую строку командам, указанным в -e. -a говорит жемчугу разворачивать каждую строку вокруг разделителя полей (это принимает значение по умолчанию для интервала), и присвойте это названному массиву @F. Результат для каждой строки, мы можем обработать его и использование $F[n] обращаться к энному элементу той строки.

Мы затем тестируем если поле 4 $F[3] содержит запускаются строки ^, словесный символ \w сопровождаемый запятой и затем другим словесным символом \w и затем конец строки $. Если это следует за нами print строка.

Если те "словесные символы" всегда будут Цитозином, Аденином, Гуанином и Тимином, Вы могли бы сделать его более явным с:

perl -ane 'print if($F[3] =~ /^[GATC],[GATC]$/);' file
3
07.11.2014, 06:30
2 ответа

Я думаю, что это то, что вы хотите

awk '{sum+=$9;a[x++]=$9;b[$9]++}b[$9]>Mode{Mode=$9}END{print "Mean: " sum/x "\nMedian: "a[int((x-1)/2)]"\nMode: " Mode}' file

, уложил neater

awk '
{
     sum+=$9
     a[x++]=$9
     b[$9]++
}
b[$9]>Mode{Mode=$9}
END{
    print "Mean: " sum/x 
    print "Median: "a[int((x-1)/2)] 
    print "Mode: " Mode
}' file

, также добавлю какую-нибудь логику для сравнения, но я на самом деле не знаю, что вы пытаетесь сравнить как Переменная только называется X, Y, Z и может иметь или не может иметь правильные уравнения

3
27.01.2020, 21:16

Я благодарен за предоставленный код user78605 , так как он помог мне найти медиану в моих запросах. Однако в вышеупомянутом коде не учитываются определенные условия, необходимые для правильного вычисления медианы.

Проблемы:

  1. Пустые завершающие строки (если они существуют в файле) не должны учитываться, поскольку их подсчет влияет на размер данных и, следовательно, на средний, медианный, режим, а также на другие статистические величины.Скорее всего, то же самое следует сделать для строк, которые не имеют числовых значений (id est: «abc» , «28b» , «h2f» , "" и так далее).
  2. Медиана - это среднее значение не исходного набора данных, а упорядоченного набора данных. То есть сначала необходимо отсортировать данные, для которых нужно найти медианное значение.
  3. Если количество значений в упорядоченном наборе данных четное, необходимо взять среднее из двух средних значений.
  4. Mode - это значение, имеющее самую высокую частоту. Набор данных может иметь более одного режима, и в этом случае два или более значения должны быть указаны как режим.

Ниже приводится мое расширение кода с учетом вышеупомянутых условий:

awk -F',' '
{col=$1}{if((col ~  /^-?[0-9]*([.][0-9]+)?$/) && ($0!=""))                 
{
     sum+=col;
     a[x++]=col;
     b[col]++
     if(b[col]>hf){hf=b[col]}
}
}
END{n = asort(a);idx=int((x+1)/2)
     print "Mean: " sum/x
     print "Median: " ((idx==(x+1)/2) ? a[idx] : (a[idx]+a[idx+1])/2)
     for (i in b){if(b[i]==hf){(k=="") ? (k=i):(k=k FS i)}{FS=","}}
     print "Mode: " k
}' file

ОБЪЯСНЕНИЕ:

Решение проблемы №1:

col = $ 1 # легче изменить столбцы, если хранится в переменной.
(col ~ /^-?[0-9 ]*([.pting[0-9 ]+)?$/) # Строка должна содержать только цифры, точку (десятичный разделитель) или тире (знак минус). [Не учитывается только научное обозначение.]
($ 0! = "") # вся строка не должна быть пустой.

В соответствующих строках выполните следующие операции цикла:

sum + = col # (Сокращение от sum = sum + col .) Сумма всех значений.
a [x ++] = col # Каждое значение сохраняется в массиве.
b [col] ++ # Значения в col обрабатываются как суррогатные ключи массива b . Следовательно, в b только столько элементов, сколько уникальных значений в col .Этот итератор создает массив значений частоты. (Сокращение от b [col] = b [col] +1 .)
if (b [col]> hf) {hf = b [col]} #Let hf означает «самая высокая частота». Переберите все частоты и обновите hf , только если будут обнаружены более высокие частоты. hf изначально "" (ничего).

Решение проблемы №2:
После завершения операций цикла:

Отсортируйте значения, хранящиеся в массиве: n = asort (a)

Это важно отметить, что исходные индексы массива a варьировались от «0» до «x-1». Помимо сортировки, новый диапазон индекса составляет от «1» до «x». Вот почему я использую int ((x + 1) / 2) вместо
int ((x-1) / 2) в качестве индекса, который содержит медиану - или меньшее из двух чисел, которые будут усреднены до медианы.

Решение проблемы №3:

((idx == (x + 1) / 2)? a [idx]: ( a [idx] + a [idx + 1]) / 2)
Это сокращенное обозначение конструкции if-else:
If int ((x + 1) / 2) равно (x + 1) / 2 , тогда количество значений нечетное, а медиана будет a [idx] . Если это не так, int () округлит (x + 1) / 2 в меньшую сторону до ближайшего целого числа, означающего, что количество значений четное. В этом случае среднее значение a [idx] и a [idx] +1 будет медианным.

Решение проблемы №4:

для (i in b) {if (b [i] == hf) {(k == "")? (k = i) :( k = k FS i)} {FS = ","}}
Поскольку hf - это значение, которое представляет наивысшую частоту в наборе данных, если любое значение b равно hf , его суррогатный ключ - это режим или, по крайней мере, один из режимов.
Этот код объединяет все суррогатные ключи, i , которые соответствуют критерию, и сохраняет их в переменной, k , который может быть напечатан в одной строке с заголовком «Режим».

Дополнительные настройки:

-F следует настроить в соответствии с тем, какой символ используется в качестве разделителя столбцов в файле.

Если в первой строке файла есть заголовки, добавьте NR> 1 перед {col = $ 1} .

FS использовалась для объединения двух переменных. Использование FS особенно полезно, когда кто-то решает не использовать разделитель. То есть FS = "" .

Данные

Следующие данные использовались для экспериментов с целью создания сценария:

10
20
10
20.5
50
30
40
50
10
30
20.5


-h
h

4.35
-537
0
-0

30
d




.

РЕЗУЛЬТАТЫ:

Mean: -13.2281
Median: 20.25
Mode: 10,30
2
27.01.2020, 21:16

Теги

Похожие вопросы