我有一段距离的赛道。我还有一个该轨道的距离坐标文件。我现在想知道轨道中每个位置被坐标文件覆盖了多少次。
例如,为简单起见,我的轨道长度为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搜索。
感谢。
答案 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)
:创建之间的序列
START
和STOP
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