估计行之间的距离差异(遗传标记)

时间:2015-07-12 17:06:59

标签: r rows bioconductor genome

我想计算给定染色体(Name)中标记(Chr)之间的距离。对象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

获得有效方法的一些想法或已知工具? 谢谢!

1 个答案:

答案 0 :(得分: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 - &gt; Gga_rs,Gga_rs - &gt; GGalu)。

执行此操作的最简单方法(计算速度非常快)将使用data.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)]