在R 2.14.1中,“by”参数中的错误符号是什么意思?

4

这是我的代码

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)

}

Im getting the following error message,

Error in seq.default(1, length(inputseq) - windowsize, by = windowsize) : 
  wrong sign in 'by' argument

我以前运行过这种类型的代码,从未遇到过这样的问题。实际上,我重新运行了之前完美运行的旧代码,但这次却收到了一条毫无意义的错误消息!在我彻底疯掉之前,我需要帮助解决这个问题...也许我只是不擅长这个程序,但我觉得它好像有自己的思想...之前我还收到过关于"ylim"函数的错误消息,指出它需要一个有限值,而我正是给了它一个有限值?救命啊!!!


1
第一个问题是在第一行需要使用nchar(inputseq)而不是length(inputseq)... - Ben Bolker
你收到 ylim 错误信息的原因是你计算的碱基频率向量中的所有内容都是 NA ... - Ben Bolker
2个回答

6

更改

starts = seq(1, length(inputseq)-windowsize, by = windowsize)

to

starts = seq(1, nchar(inputseq)-windowsize, by = windowsize)

假设您正在使用作为输入序列的字符向量,例如:
slidingwindowplotATGC(3, "ATAGACGATACGATACCCCGAGGGTAGGTA")

备注:除此之外,您在使用字符向量方面还存在一些非常严重的问题。例如:

 windowsize[starts[i]:(starts[i]+9999)]
  1. 为什么你看起来在从windowsize中选择,而这只是你窗口大小的整数?你是想从inputseq中选择吗?

  2. 即使你是从inputseq中进行选择,方法是使用substr(inputseq, start, stop)

  3. starts[i]+9999是从哪里来的?你是想说starts[i]+windowsize吗?

你应该重新开始,仔细考虑你要做什么,并学习在R中完成它所需的正确工具。

预计完成时间:这里提供了一个重写的方案(你需要先安装zoo包):

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
用户1048244:代码的其余部分不太可靠,至少如果您使用字符向量调用函数时是这样的。您是否可能使用其他东西来调用它,例如字符串向量(这是完全不同的事情)?无论如何,请尝试使用我上面的代码。 - David Robinson
好的,谢谢您发布这个重写,但那不是我现在需要的,那里有些函数我甚至不理解。就像我的最初问题所述,我遇到了这个毫无意义的错误。我以前已经运行过这段完全相同的代码而没有出错,什么都没有改变,但现在它停止工作了。为什么呢? - TheFoxx
1
@user1048244:你正在使用不同类型的变量(即ruminisseq的类型)进行调用。在此之前,您必须一直使用单个字符串的向量或类似的东西进行调用(例如c(“a”,“c”,“g”,“g”,“g”,“a”,“t”))。现在,您正在使用像“acgggat”这样的字符向量进行调用。对于字符向量,此代码都不起作用。 - David Robinson
你可以使用 dput(ruminisseq) 来获取一个我们可以复现的 ruminisseq 版本,并将其粘贴到问题中吗?(或者可能是一个表现出相同问题行为的较短序列) - David Robinson
请查看我上面的注释。这种数据类型的差异解释/帮助你通过第一行,但很难理解for循环内的第一行代码的意义/可能的意义。(如果我使用字符向量运行,我可以顺利完成循环而没有错误,但如上所述,结果中全部为“ NA”。) - Ben Bolker
显示剩余7条评论

4
进一步压缩。您需要单独指定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——极有可能在其中找到高效的代码来进行此类汇总。

如果你想使用字符向量运行它(即预先拆分),那么只需注释掉第一行并将s替换为inputseq - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接