Расчет квинтилей с bash - PullRequest
1 голос
/ 05 мая 2020

Как мне подойти к вычислению квинтилей из файла csv?

6
2
15
90
9
1
4
30
1

Вывод:

6,3
2,2
15,4
90,5
9,4
1,1
4,3
30,5
1,1

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Версия awk, которая не заботится о значениях, а о месте при сортировке по значению. Quintilies определены на более ранней версии вашего вопроса:

awk '
BEGIN {
    FS=OFS=","
}
{
    a[NR]=$0
}
END {
    for(i=1;i<=int(0.2*NR);i++)
        b[i]=1
    for(;i<=(0.4*NR);i++)
        b[i]=2
    for(;i<=(0.6*NR);i++)
        b[i]=3
    for(;i<=(0.8*NR);i++)
        b[i]=4
    for(;i<=NR;i++)
        b[i]=5
    for(i=1;i<=NR;i++)
        print a[i],b[i]
}' <(sort -t, -k3n file)

Вывод:

k,l,1,1
q,r,1,2     < this differs
c,d,2,2
m,n,4,3
a,b,6,3
i,j,9,4
e,f,15,4
o,p,30,5
g,h,90,5

Обновление: Более компактная версия который по-прежнему зависит от позиции значения в упорядоченном списке значений, но сохраняет равные значения в одном и том же квинтиле.

$ awk '
BEGIN {
    FS=OFS=","
}
{
    a[NR]=$0                     # hash all values index on order #
}
END {                            # after all values are hashed
    for(i=1;i<=NR;i++) {         # loop thru them all 
        j+=(i>j*0.2*NR&&a[i]!=p) # figuring out current quintile
        print a[i],j             # output
        p=a[i]
    }
}' <(sort -n file)

С GNU awk вы можете определить PROCINFO["sorted_in"]="@val_num_asc" и потерять sort. Вывод для последней версии набора данных OP:

1,1
1,1
2,2
4,3
6,3
9,4
15,4
30,5
90,5
0 голосов
/ 05 мая 2020

Вот сценарий оболочки, который использует sqlite3 для вычисления квинтилей с помощью своей ntile() оконной функции, которая делит значения на заданное количество групп:

#!/bin/sh
printf "%s\n" \
       "CREATE TABLE data(a, b, c INTEGER);" \
       ".import '$1' data" \
       "SELECT a, b, c, ntile(5) OVER (ORDER BY c) FROM data ORDER BY rowid;" |
    sqlite3 -csv -batch -noheader

Пример:

$ ./quintile.sh input.csv
a,b,6,3
c,d,2,2
e,f,15,4
g,h,90,5
i,j,9,3
k,l,1,1
m,n,4,2
o,p,30,4
q,r,1,1

(требуется sqlite3 версия 3.25 или новее)

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