这是我的代码
slidingwindowplotATGC = function(windowsize, inputseq)
{
starts = seq(1, length(inputseq)-windowsize, by = windowsize)
n = length(starts)
chunkGs = numeric(n)
chunkAs = numeric(n)
chunkTs = numeric(n)
chunkCs = numeric(n)
for (i in 1:n) {
chunk = windowsize[starts[i]:(starts[i]+9999)]
chunkG = sum("g" == chunk)/length(chunk)
chunkA = sum("a" == chunk)/length(chunk)
chunkT = sum("t" == chunk)/length(chunk)
chunkC = sum("c" == chunk)/length(chunk)
chunkGs[i] = chunkG
chunkAs[i] = chunkA
chunkTs[i] = chunkT
chunkCs[i] = chunkC
}
plot(starts,chunkGs,type="b",ylim=c(min(min(chunkAs),min(chunkTs),min(chunkCs),min(chunkGs)),max(max(chunkAs),max(chunkTs),max(chunkCs),max(chunkGs))),col = "red")
points(starts,chunkTs,col = "blue")
points(starts,chunkAs,col = "green")
points(starts,chunkCs)
}
我收到以下错误消息,
Error in seq.default(1, length(inputseq) - windowsize, by = windowsize) :
wrong sign in 'by' argument
这是我在运行此类代码之前从未得过的,事实上我重新运行以前运行良好的旧代码,除了这次我得到的这个错误消息似乎没有任何意义!在我完全疯了之前我需要帮助...也许我只是在这个程序上很糟糕,但在我看来它有自己的想法...我在关于ylim函数之前也收到了一条错误信息,声明它需要是一个有限的值,这就是我给它的东西? HELP !!!
答案 0 :(得分:3)
更改
starts = seq(1, length(inputseq)-windowsize, by = windowsize)
到
starts = seq(1, nchar(inputseq)-windowsize, by = windowsize)
假设您使用字符向量作为inputseq,例如
slidingwindowplotATGC(3, "ATAGACGATACGATACCCCGAGGGTAGGTA")
ETA:除了这种差异之外,你如何使用角色向量还有一些非常严重的问题。例如:
windowsize[starts[i]:(starts[i]+9999)]
为什么看起来你正在从windowsize中选择,这只是你窗口大小的整数?您是否尝试从inputseq中进行选择?
即使您从inputseq中选择,这样做的方法是substr(inputseq, start, stop)
starts[i]+9999
来自哪里?你的意思是starts[i]+windowsize
?
您应该重新开始并仔细考虑您要做的事情,并在R中学习正确的工具。
ETA:这是对你要做的事情的拟议改写(你需要先安装动物园包):
library(zoo)
slidingwindowplotATGC = function(windowsize, inputseq)
{
print(nchar(inputseq)-windowsize)
s = strsplit(inputseq, "")[[1]]
starts = seq(1, nchar(inputseq)-windowsize, by = windowsize)
n = length(starts)
letters = c("a", "c", "g", "t")
colors = c("green", "black", "red", "blue")
counts = t(sapply(letters, function(l) rollapply(s, windowsize, function(x) mean(x == l))))
plot(counts[1, ], type="l", col=colors[1])
for (i in 2:4) {
points(counts[i, ], type="l", col=colors[i])
}
print(counts)
}
slidingwindowplotATGC(10, "aagaaaagatcaaagaccagccgccccaccccccagagccccccc")
这应该可以帮助你完成大部分工作。在那之后,你自己; - )
答案 1 :(得分:3)
进一步凝结。您需要分别指定windowsize
(窗口宽度)和by
(采样周期),尽管我认为您希望它们相同(即将序列切换为独占)块) - 如果你想要一个滑动窗口,你可以使用by=1
。
您上面看到的错误最有可能发生,因为某些原因windowsize
大于nchar(inputseq)
。
slidingwindowplotATGC = function(windowsize, by, inputseq) {
s = strsplit(inputseq, "")[[1]]
colors = c("green", "black", "red", "blue")
counts = rollapply(factor(s), width=windowsize, by=by,table)
matplot(counts,type="l", lty=1,col=colors)
counts
}
itest <- "aagaaaagatcaaagaccagccgccccaccccccagagccccccc"
slidingwindowplotATGC(10, itest)
您还应该检查Bioconductor - 在某处可以使用有效的代码进行此类摘要。