我有两个数据框,一个叫做segments
包含数字“开始”和“停止”值
segments <- as.data.frame(
cbind(
rep(seq(1, 22, 1), 2),
seq(500000, 3000000, 57000),
seq(1000000, 3500000, 57000)
)
)
colnames(segments) <- c("chr", "segment.start", "segment.end")
另一个,称为positions
包含数值。
positions <- as.data.frame(cbind(1, seq(750000, 2000000, 56000)))
colnames(positions) <- c("chr", "pos")
我有兴趣计算segments
“开始”和“停止”值之间的区域与每个值重叠的行positions
数,并将这些计数添加到positions
.
positions$count <- 0
我可以使用以下 for 循环获得这些计数,但在大型数据集上这非常慢。
for (n in 1:nrow(segments)) {
segment <- segments[n, ]
to.update <- which(
positions$pos >= segment$segment.start &
positions$pos <= segment$segment.end &
positions$chr == segment$chr
)
positions[to.update, "count"] <- positions[to.update, "count"] + 1
}
有谁知道如何在没有 for 循环的情况下获得这些计数?
无需验证,我认为这可以用data.table
. 我确信它可以用其他工具(base 或tidyverse
)来完成,但这速度很快,并且使用了我最近经常使用的工具:foverlaps
.
library(data.table)
setDT(segments)
setDT(positions)
positions[, pos2 := pos ]
setkey(segments, segment.start, segment.end)
setkey(positions, pos, pos2)
作为解释点,foverlaps
要求两帧都有两个场,功能的前提是一帧范围内的重叠与另一帧的重叠。尽管有人可能会争辩说,在此重叠检查中使用单列选项可能很有用,但添加第二列(pos2
在这种情况下)是微不足道的,并且无需更改data.table
代码即可实现完全相同的功能。
编辑:更新为包含“by chr
”逻辑。
编辑 2:倒置,导致positions
作为主要:
foverlaps(positions, segments) [
, .(count = sum(!is.na(segment.start))), by = .(chr, pos, pos2) ][
, pos2 := NULL ]
# chr pos count
# 1: 1 750000 1
# 2: 1 806000 1
# 3: 1 862000 1
# 4: 1 918000 1
# 5: 1 974000 1
# 6: 1 1030000 0
# 7: 1 1086000 0
# 8: 1 1142000 0
# 9: 1 1198000 0
# 10: 1 1254000 0
# 11: 1 1310000 0
# 12: 1 1366000 0
# 13: 1 1422000 0
# 14: 1 1478000 0
# 15: 1 1534000 0
# 16: 1 1590000 0
# 17: 1 1646000 0
# 18: 1 1702000 0
# 19: 1 1758000 1
# 20: 1 1814000 1
# 21: 1 1870000 1
# 22: 1 1926000 1
# 23: 1 1982000 1
# chr pos count
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句