[英]Calculating quintiles with bash
我將如何從 csv 文件中計算五分位數?
6
2
15
90
9
1
4
30
1
Output:
6,3
2,2
15,4
90,5
9,4
1,1
4,3
30,5
1,1
一個 awk 版本,它不關心值,而是按值排序時的位置。 五分位數是在您問題的早期版本中定義的:
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)
Output:
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
更新:一個更緊湊的版本,它仍然依賴於值的有序列表中的值的 position,但在相同的五分位數中保持相等的值。
$ 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
。 Output 用於 OP 樣本數據集的后一個版本:
1,1
1,1
2,2
4,3
6,3
9,4
15,4
30,5
90,5
這是一個 shell 腳本,它使用 sqlite3 用它的ntile()
window function 計算五分位數,它將值分成給定數量的組:
#!/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 或更高版本)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.