Eve*_*r69 1 unix bash awk grouping dataframe
这是我的输入文件:
1.37987
1.21448
0.624999
1.28966
1.77084
1.088
1.41667
Run Code Online (Sandbox Code Playgroud)
我想创建我选择的大小的垃圾箱以获得类似直方图的输出,例如对于 0.1 个垃圾箱,从 0 开始:
0 0.1 0
...
0.5 0.6 0
0.6 0.7 1
...
1.0 1.1 1
1.1 1.2 0
1.2 1.3 2
1.3 1.4 1
...
Run Code Online (Sandbox Code Playgroud)
我的文件对于 R 来说太大了,所以我正在寻找 awk 解决方案(也对我能理解的其他任何内容开放,因为我仍然是 Linux 初学者)。
这在这篇文章中已经得到了回答:awk histogram in buckets,但该解决方案对我不起作用。
即使不完全正确,这也应该非常接近。至少将其视为一个起点,并自己验证/计算出数学(特别是决定/验证精确边界匹配0.2应该进入哪个桶 - 0.1 到 0.2 和/或 0.2 到 0.3?):
$ cat tst.awk
BEGIN { delta = (delta == "" ? 0.1 : delta) }
{
bucketNr = int(($0+delta) / delta)
cnt[bucketNr]++
numBuckets = (numBuckets > bucketNr ? numBuckets : bucketNr)
}
END {
for (bucketNr=1; bucketNr<=numBuckets; bucketNr++) {
end = beg + delta
printf "%0.1f %0.1f %d\n", beg, end, cnt[bucketNr]
beg = end
}
}
$ awk -f tst.awk file
0.0 0.1 0
0.1 0.2 0
0.2 0.3 0
0.3 0.4 0
0.4 0.5 0
0.5 0.6 0
0.6 0.7 1
0.7 0.8 0
0.8 0.9 0
0.9 1.0 0
1.0 1.1 1
1.1 1.2 0
1.2 1.3 2
1.3 1.4 1
1.4 1.5 1
1.5 1.6 0
1.6 1.7 0
1.7 1.8 1
Run Code Online (Sandbox Code Playgroud)
请注意,您可以在命令行上指定存储桶增量大小,0.1 只是默认值:
$ awk -v delta='0.3' -f tst.awk file
0.0 0.3 0
0.3 0.6 0
0.6 0.9 1
0.9 1.2 1
1.2 1.5 4
1.5 1.8 1
$ awk -v delta='0.5' -f tst.awk file
0.0 0.5 0
0.5 1.0 1
1.0 1.5 5
1.5 2.0 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6153 次 |
| 最近记录: |