我有一个类似下面的数据框:
output: Values
NC_011163.1:1-210 12
NC_011163.1:211-420 4
NC_011163.1:421-630 2
我想使用210的窗口扫描数据框,并计算每210个窗口中的值的数量。
期望的输出:
set ANT_HOME in class path
我非常感谢您为解决此问题所做的贡献。
由于
V
答案 0 :(得分:2)
如果你使用python和Pandas,你可以这样做:
将您的数据保存在数据框df
中:
NC N
0 NC_011163.1 1
1 NC_011163.1 22
2 NC_011163.1 44
3 NC_011163.1 65
4 NC_011163.1 73
5 NC_011163.1 87
6 NC_011163.1 104
7 NC_011163.1 130
8 NC_011163.1 151
9 NC_011163.1 172
10 NC_011163.1 194
11 NC_011163.1 210
12 NC_011163.1 235
13 NC_011163.1 255
14 NC_011163.1 295
15 NC_011163.1 320
16 NC_011163.1 445
17 NC_011163.1 520
df.groupby([df.NC, pd.cut(df.N, range(0,631,210))]).count()
N
NC N
NC_011163.1 (0, 210] 12
(210, 420] 4
(420, 630] 2
其中:
pd.cut(df.N, range(0, 631, 210))
返回哪个分箱是N
列中的值。 bin由范围定义,创建3个bin:[0, 210, 420, 630]
。count
每组中的元素数量。答案 1 :(得分:1)
$ cat tst.awk
BEGIN { FS=":"; OFS="\t"; endOfRange=210 }
{
key = $1
bucket = int((($2-1)/endOfRange)+1)
cnt[bucket]++
maxBucket = (bucket > maxBucket ? bucket : maxBucket)
}
END {
for (bucket=1; bucket<=maxBucket; bucket++) {
print key ":" ((bucket-1)*endOfRange)+1 "-" bucket*endOfRange, cnt[bucket]+0
}
}
$ awk -f tst.awk file
NC_011163.1:1-210 12
NC_011163.1:211-420 4
NC_011163.1:421-630 2
请注意,即使您的输入数据中有一些没有值的范围(它将打印计数为零的范围),这也会起作用,并且它将始终按数字顺序打印范围(使用{时的输出顺序) {1}}运算符是“随机的”):
in
答案 2 :(得分:0)
awk -v t=210 'BEGIN{FS=":";t++}{++a[int($2/t)]}
END{for(x in a){printf "%s:%s\t%d\n",$1,t*x"-"(x+1)*t,a[x]}}' file
将提供此输出:
NC_011163.1:0-211 12
NC_011163.1:211-422 4
NC_011163.1:422-633 2
您无需了解最大值是什么,结果中有多少个部分/范围。这个命令适合你。
我认为代码也很容易理解,大多数代码都是输出格式。