可怕的标题问题,但这是我想要解决的问题。对于表1,我想添加“ BETWEEN”列,以验证表2中相应“ BIN”的“ POSITION”是否介于“ START”和“ STOP”值之间。
表1。BIN名称(字符)和BIN(数字)中的POSITION:
BIN POSITION
1 12
1 52
1 86
7 6
7 22
X 112
X 139
MT 3
MT 26
Run Code Online (Sandbox Code Playgroud)
表2:BIN名称(字符)以及START和STOP位置(数字)
BIN START STOP
1 2 64
1 90 110
7 20 100
7 105 200
X 1 5
MT 1 1000
Run Code Online (Sandbox Code Playgroud)
和预期的结果-表1与“ BETWEEN”:
CHROM POSITION BETWEEN
1 12 TRUE
1 52 TRUE
1 86 FALSE
7 6 FALSE
7 22 TRUE
X 112 FALSE
X 139 FALSE
MT 3 TRUE
MT 26 TRUE
Run Code Online (Sandbox Code Playgroud)
我的表1大约有4,000,000行,表2大约有500,000行,我想到的一切都很慢。
作为较大表的示例,请使用以下命令:
positions <- seq(1,100000,10)
bins <- c("A","B","C","D","E","F","G","H","I","J")
tab1 <- data.table(bin = rep(bins,1,each=length(positions)), pos = rep(positions,10))
tab2 <- data.table(bin = rep(bins,1,each=2000), start = seq(5,100000,50), stop = start+25)
Run Code Online (Sandbox Code Playgroud)
所需的输出将是:
tab1
bin pos between
1: A 1 FALSE
2: A 11 TRUE
3: A 21 TRUE
4: A 31 FALSE
5: A 41 FALSE
Run Code Online (Sandbox Code Playgroud)
以下方法要求对于给定的 bin,这些 bin 是互斥的。(例如,您不能拥有边界为 1-5 的 bin A 和边界为 4-8 的另一个 bin A。)此外,我对您的示例进行了一些修改。
positions <- seq(1,100000,10)
bins <- c("A","B","C","D","E","F","G","H","I","J")
tab1 <- data.table(bin = rep(bins,1,each=length(positions)), pos = rep(positions,10))
setkey(tab1,"bin","pos")
tab2 <- data.table(bin = rep(bins,1,each=2000), start = seq(5,100000,50))
tab2[, end := start+25]
tab2[,pos:=start]
setkey(tab2,"bin","pos")
x<-tab2[tab1, roll=TRUE, nomatch=0]
tab2[,pos:=end]
setkey(tab2,"bin","pos")
y<-tab2[tab1, roll=-Inf, nomatch=0]
setkey(x,"bin","pos","start")
setkey(y,"bin","pos","start")
inBin<-x[y,nomatch=0]
inBin[, between:=TRUE]
setkey(tab1,"bin","pos")
setkey(inBin,"bin","pos")
result<-inBin[,list(bin,pos,between)][tab1]
result[is.na(between), between:=FALSE]
Run Code Online (Sandbox Code Playgroud)
我现在没有时间深入解释我的解决方案。相反,我会采取便宜的方法并建议您研究rolldata.table 的参数。上面的基本方法是我加入 tab1 和 tab2,将 pos 向前滚动到最近的末端边界。然后我加入 tab1 和 tab2,将 pos 向后滚动到最近的开始边界。然后我对这两个集合进行内部联接,给出 tab1 中落在 bin 边界内的所有行。从那时起,这只是一项繁重的工作。
| 归档时间: |
|
| 查看次数: |
1260 次 |
| 最近记录: |