绘制与R中其他行定义的接近度内的数字行

时间:2013-10-06 23:18:35

标签: r

我有一个不同染色体上的数字(遗传数据)数据框,可以被认为是分开数字的因素。它看起来像这样(相邻列包含每个位置的样本信息):

awk '{print $2 "\t"   $3}' log_values | head 
Chr   Start    Sample1     Sample2
1   102447376  0.46957632  0.38415043
1   102447536  0.49194950  0.30094824
1   102447366  0.49874880 -0.17675325
2   102447366 -0.01910729  0.20264680
1   108332063 -0.03295081  0.07738970
1   109472445  0.02216355 -0.02495788

我想做的是制作一系列图表,从这个文件中的其他列中获取值。而不是为每一行绘制一个(这将代表不同区域和/或不同样本中的结果),我想绘制覆盖范围的图表,如果“开始”列中的值足够接近彼此。首先,如果Start列中有三个值,彼此说1000,我想要绘制一个图。也就是说,从A到B到C包括1000,使得A到B <= 1000并且B到C是&lt; = 1000但是A到C不必是&lt; = 1000.在下面的代码中,这个1000是“CNV_size”。 “flanking_size”变量只是为了将绘图缩小一点,所以我可以给它一些上下文。

取样本值,第1行和第3行将突出显示为Sample1的一个图。这些样本数是log2Ratios所以我只想绘制重要的数字。我将其定义为高于0.4或低于-0.6。这意味着相同的三行不会产生样本2的图。

第四行不包括在内,因为Chr列数/因子不同。这是每列的单独图,仅显示满足此条件的行中的值。因此,我可以为每个样本绘制更多的绘图,但是满足此标准的每组区域都将绘制在所有样本中。如果这没有意义,也许我下面的无效尝试将有助于解释我正在讨厌的事情。

pdf("All_CNVs_closeup.pdf")

CNV_size <- 1000 # bp 
flanking_size <- 1000 # bp

#for(chr in 1:24){
for(chr in 1:1){
 #for(array in 1:24) {
for(array in 1:4) {

 dat <- subset(file, file$Chr == chr ) 
 dat <- subset(dat, dat[,array+6] > 0.4 | dat[,array+6] < -0.6) 
 if(length(dat$Start) > 1 ) { 
 dat <- dat[with(dat, order(Start)), ]

x=dat$Start[2:length(dat$Start)]-dat$Start[1:(length(dat$Start)-1)]
cnv <- 1
while(cnv <= length(x)) { 
for(i in cnv:length(x) ) {
    if(x[i] >= CNV_size) {
        plot_title <- paste(sample_info$Sample.ID[array], files[array],   sep = "   ") 
        plot(dat$Start, -dat[,array+6], main = plot_title , ylim = c(-2,2),      xlim = c(dat$Start[cnv] - flanking_size , dat$Start[i ] + flanking_size) , xlab = chr, ylab = "Log2 Ratio") 
        abline(h = 0.4, col="blue") 
        abline(h = 0, col="red") 
        abline(h = -0.6, col="blue") 
    break
    } # if(x[i] >= CNV_size) {      
    #if(x[i] < CNV_size) i <- i + 1
}   # for(i in cnv:length(x) ) {

cnv <- i 

} # while(x[cnv] <= length(x)) { 
  } # if(length(dat$Start) > 1 ) { 
  } # for(array in 1:24) {
} # for(chr in 1:24){



 dev.off()

1 个答案:

答案 0 :(得分:0)

您可以编写一个循环,根据条件累积索引,然后绘制每个窗口:

# Assuming your dataframe is called SNPs.
getChrWindows <- function(snps, windowSize) {
  curWindow <- 1
  windows <- list()
  for(i in 2:nrow(snps)) {
    # If pair is on the same chromosome and within the window, add it
    if(snps$Chr[i-1] == snps$Chr[i] && 
       (snps$Start[i] - snps$Start[i-1]) <= windowSize) {
      tryCatch({
        windows[[curWindow]]
      }, error = function(e) {
        windows[[curWindow]] <- c(i-1)    
      }, finally {
        windows[[curWindow]] <- c(windows[[curWindow]], i)
      })
    } else {
      # If there is an existing window, create a new one.
      tryCatch({
        windows[[curWindow]]
      }, error = function(e) {
        curWindow <- curWindow + 1
      })
    }
  }
  return(windows)
}

现在,您可以获取data.frame中所有窗口的列表,并绘制每个窗口:

windows <- getChrWindows(snps, 1000)
for (i in seq_along(windows)) {
  # plot snps[windows[[i]],] using your plotting code.
}