在覆盖图中转换轨道中的距离

时间:2017-10-24 12:38:23

标签: r bash awk

我有一段距离的赛道。我还有一个该轨道的距离坐标文件。我现在想知道轨道中每个位置被坐标文件覆盖了多少次。

例如,为简单起见,我的轨道长度为10,我的坐标文件包含以下事件:

ID START END AMOUNT
1  2     4   1
2  3     7   2
3  3     4   1
4  4     10  1

这里我们看到4个事件,第二个事件发生两次,因此需要计算两次。输出应为:

POS COV
2   1
3   4
4   5
5   3
6   3
7   3
8   1
9   1
10  1

这对于我的目的来说是疯狂的,但我觉得解决方案很简单,而且我没有正确地使用Google搜索。

感谢。

2 个答案:

答案 0 :(得分:2)

以下是通过基础R使用mapply的解决方案,

as.data.frame(table(unlist(rep(mapply(`:`, df$START, df$END), df$AMOUNT))))

给出,

  Var1 Freq
1    2    1
2    3    4
3    4    5
4    5    3
5    6    3
6    7    3
7    8    1
8    9    1
9   10    1

分解以上内容:

  • mapply(`:`, df$START, df$END):创建之间的序列 STARTSTOP
  • rep(mapply(`:`, df$START, df$END), df$AMOUNT)):按AMOUNT
  • 复制每个序列
  • table(unlist(rep(mapply(`:`, df$START, df$END), df$AMOUNT))):创建频率表
  • as.data.frame:将其包装到数据框(table的原始输出是命名向量)

答案 1 :(得分:1)

$ cat file
ID START END AMOUNT
1  2     4   1
2  3     7   2
3  3     4   1
4  4     10  1

$ cat cov.awk
NR > 1 {for (i=1; i<=$4; ++i)
          for (j=$2; j<=$3; ++j) cov[j] += 1}

END {for (i=1; i<=len; ++i)
       if (i in cov) print i, cov[i]}

$ awk -v len=10 -f cov.awk file
2 1
3 4
4 5
5 3
6 3
7 3
8 1
9 1
10 1