位于指定范围内的值的数量

时间:2016-08-18 12:03:50

标签: python unix pandas awk

我有一个类似下面的数据框:

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

3 个答案:

答案 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]
  • 然后你分组:
    • NC编号(因此它与您的输出相匹配,但这里没用,因为只有一个组,但我猜你会有其他染色体,因此它会执行每条染色体的操作)
    • 您刚刚制作的垃圾箱
  • 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
  • 您无需了解最大值是什么,结果中有多少个部分/范围。这个命令适合你。

  • 我认为代码也很容易理解,大多数代码都是输出格式。