估计行之间的距离差异(遗传标记)
Estimating distance difference between rows (genetic markers)
我想计算给定染色体 (Chr
) 中标记 (Name
) 之间的距离。对象 dist1.alldown
(下游距离)和 dist1.allup
(上游距离)正是我想要的。但是,下面的脚本计算效率低下(我的真实数据可能包含数百万个标记,而且这个循环非常耗时)。
df <- 'Name Chr Position
GGaluGA001820 chr1 34388
Gga_rs16686671 chr1 67781
GGaluGA001841 chr1 80477
Gga_rs15995401 chr1 111556
Gga_rs15995393 chr1 112481
GGaluGA001890 chr1 149690
GGaluGA001902 chr1 176450
Gga_rs14688751 chr1 185573
GGaluGA001921 chr1 202425
GGaluGA001945 chr1 235155'
df <- read.table(text=df, header=T)
probes <- df
probes.split <- split(probes, probes$Chr)
####### Loop to infer distance upstream #####
{dist1.all <- NULL
for(k in 1:length(probes.split)){
probescx <- probes.split[[k]]
probescx <- probescx[order(probescx$Position, decreasing=F),]
for(i in 1:nrow(probescx)){
v <- vector()
v[k] <- k^2; print(paste(k,i))
rowx <- probescx[i,]
rowxm1 <- probescx[i-1,]
if(nrow(rowxm1) > 0){
lab <- rowx[1,1:2]
dist1 <- rowx[1,3] - rowxm1[1,3]
dist1 <- as.data.frame(dist1)
dist1 <- cbind(lab, dist1)
dist1.all <- rbind(dist1.all, dist1)
}
}
}
}
### Save a different object
dist1.allup <- dist1.all
##background of up object
dist1.allupback <- dist1.allup
### Loop to infer distance downstream
{dist1.all <- NULL
for(k in 1:length(probes.split)){
probescx <- probes.split[[k]]
probescx <- probescx[order(probescx$Position, decreasing=F),]
for(i in 1:nrow(probescx)){
v <- vector()
v[k] <- k^2; print(paste(k,i))
rowx <- probescx[i,]
rowxm1 <- probescx[i+1,]
if(nrow(rowxm1) > 0){
lab <- rowx[1,1:2]
dist1 <- rowx[1,3] - rowxm1[1,3]
dist1 <- as.data.frame(dist1)
dist1 <- cbind(lab, dist1)
dist1.all <- rbind(dist1.all, dist1)
}
}
}
}
### Save a different object
dist1.alldown <- dist1.all
##background of down object
dist1.alldownback <- dist1.alldown
## Turn distance in positive integers
dist1.alldown$dist1 <- dist1.alldown$dist1 * -1
获得有效方法的一些想法或已知工具?
谢谢!
让我们稍微简化一下您的数据。你有:
> df
Name Chr Position
1 GGaluGA001820 chr1 34388
2 Gga_rs16686671 chr1 67781
3 GGaluGA001841 chr1 80477
4 Gga_rs15995401 chr1 111556
5 Gga_rs15995393 chr1 112481
6 GGaluGA001890 chr1 149690
7 GGaluGA001902 chr1 176450
8 Gga_rs14688751 chr1 185573
9 GGaluGA001921 chr1 202425
10 GGaluGA001945 chr1 235155
基于
> dist1.allup
Name Chr dist1
2 Gga_rs16686671 chr1 33393
3 GGaluGA001841 chr1 12696
4 Gga_rs15995401 chr1 31079
5 Gga_rs15995393 chr1 925
6 GGaluGA001890 chr1 37209
7 GGaluGA001902 chr1 26760
8 Gga_rs14688751 chr1 9123
9 GGaluGA001921 chr1 16852
10 GGaluGA001945 chr1 32730
您正在寻找标记之间的行向距离(即 GGalu -> Gga_rs、Gga_rs -> GGalu)。
最直接的方法(而且计算速度非常快)是 data.table
。
首先设置一个数据table
library(data.table)
setDT(df)
然后,对你的数据进行排序,使你有连续的标记(你的数据可能已经是这样了,但最好确保:
df <- df[order(Chr,Position)]
然后,为 Chr、Name 和 Position 创建偏移数据:
df[, ChrN := Chr[.I + 1]]
df[, NameN := Name[.I + 1]]
df[, PosN := Position[.I + 1]]
我们只想在同一条染色体上进行比较:
df <- df[Chr == ChrN]
现在我们可以计算距离了
df[, list(NameFrom = Name, NameTo = NameN, Chr, dist = PosN - Position)]
由于这是矢量化的,并且用于内存操作,因此它应该比上面的循环方法快得多。
对于all.down,使用:
df <- df[-order(Chr,Position)]
和
df[, list(NameFrom = Name, NameTo = NameN, Chr, dist = PosN - Position)]
变成
df[, list(NameFrom = Name, NameTo = NameN, Chr, dist = Position - PosN)]
我想计算给定染色体 (Chr
) 中标记 (Name
) 之间的距离。对象 dist1.alldown
(下游距离)和 dist1.allup
(上游距离)正是我想要的。但是,下面的脚本计算效率低下(我的真实数据可能包含数百万个标记,而且这个循环非常耗时)。
df <- 'Name Chr Position
GGaluGA001820 chr1 34388
Gga_rs16686671 chr1 67781
GGaluGA001841 chr1 80477
Gga_rs15995401 chr1 111556
Gga_rs15995393 chr1 112481
GGaluGA001890 chr1 149690
GGaluGA001902 chr1 176450
Gga_rs14688751 chr1 185573
GGaluGA001921 chr1 202425
GGaluGA001945 chr1 235155'
df <- read.table(text=df, header=T)
probes <- df
probes.split <- split(probes, probes$Chr)
####### Loop to infer distance upstream #####
{dist1.all <- NULL
for(k in 1:length(probes.split)){
probescx <- probes.split[[k]]
probescx <- probescx[order(probescx$Position, decreasing=F),]
for(i in 1:nrow(probescx)){
v <- vector()
v[k] <- k^2; print(paste(k,i))
rowx <- probescx[i,]
rowxm1 <- probescx[i-1,]
if(nrow(rowxm1) > 0){
lab <- rowx[1,1:2]
dist1 <- rowx[1,3] - rowxm1[1,3]
dist1 <- as.data.frame(dist1)
dist1 <- cbind(lab, dist1)
dist1.all <- rbind(dist1.all, dist1)
}
}
}
}
### Save a different object
dist1.allup <- dist1.all
##background of up object
dist1.allupback <- dist1.allup
### Loop to infer distance downstream
{dist1.all <- NULL
for(k in 1:length(probes.split)){
probescx <- probes.split[[k]]
probescx <- probescx[order(probescx$Position, decreasing=F),]
for(i in 1:nrow(probescx)){
v <- vector()
v[k] <- k^2; print(paste(k,i))
rowx <- probescx[i,]
rowxm1 <- probescx[i+1,]
if(nrow(rowxm1) > 0){
lab <- rowx[1,1:2]
dist1 <- rowx[1,3] - rowxm1[1,3]
dist1 <- as.data.frame(dist1)
dist1 <- cbind(lab, dist1)
dist1.all <- rbind(dist1.all, dist1)
}
}
}
}
### Save a different object
dist1.alldown <- dist1.all
##background of down object
dist1.alldownback <- dist1.alldown
## Turn distance in positive integers
dist1.alldown$dist1 <- dist1.alldown$dist1 * -1
获得有效方法的一些想法或已知工具? 谢谢!
让我们稍微简化一下您的数据。你有:
> df
Name Chr Position
1 GGaluGA001820 chr1 34388
2 Gga_rs16686671 chr1 67781
3 GGaluGA001841 chr1 80477
4 Gga_rs15995401 chr1 111556
5 Gga_rs15995393 chr1 112481
6 GGaluGA001890 chr1 149690
7 GGaluGA001902 chr1 176450
8 Gga_rs14688751 chr1 185573
9 GGaluGA001921 chr1 202425
10 GGaluGA001945 chr1 235155
基于
> dist1.allup
Name Chr dist1
2 Gga_rs16686671 chr1 33393
3 GGaluGA001841 chr1 12696
4 Gga_rs15995401 chr1 31079
5 Gga_rs15995393 chr1 925
6 GGaluGA001890 chr1 37209
7 GGaluGA001902 chr1 26760
8 Gga_rs14688751 chr1 9123
9 GGaluGA001921 chr1 16852
10 GGaluGA001945 chr1 32730
您正在寻找标记之间的行向距离(即 GGalu -> Gga_rs、Gga_rs -> GGalu)。
最直接的方法(而且计算速度非常快)是 data.table
。
首先设置一个数据table
library(data.table)
setDT(df)
然后,对你的数据进行排序,使你有连续的标记(你的数据可能已经是这样了,但最好确保:
df <- df[order(Chr,Position)]
然后,为 Chr、Name 和 Position 创建偏移数据:
df[, ChrN := Chr[.I + 1]]
df[, NameN := Name[.I + 1]]
df[, PosN := Position[.I + 1]]
我们只想在同一条染色体上进行比较:
df <- df[Chr == ChrN]
现在我们可以计算距离了
df[, list(NameFrom = Name, NameTo = NameN, Chr, dist = PosN - Position)]
由于这是矢量化的,并且用于内存操作,因此它应该比上面的循环方法快得多。
对于all.down,使用:
df <- df[-order(Chr,Position)]
和
df[, list(NameFrom = Name, NameTo = NameN, Chr, dist = PosN - Position)]
变成
df[, list(NameFrom = Name, NameTo = NameN, Chr, dist = Position - PosN)]