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