1. ホーム
  2. r

[解決済み] R 2.14.1 の引数 'by' の符号がおかしいのはどういう意味ですか?

2022-02-16 14:55:40

質問

以下は私のコードです。

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関数に関しても以前はエラーメッセージが出ていて、有限の値である必要があると書いてありましたが、これは私が与えていたものなのでしょうか?助けてください!!!

解決方法は?

変更

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)]

  1. なぜwindowsizeから選択しているように見えるのか、それは単にウィンドウサイズを整数で表しているだけなのでは?inputseqから選択しようとしたのでしょうか?

  2. inputseqから選択していたとしても、その方法は substr(inputseq, start, stop)

  3. はどこにあるのでしょうか? starts[i]+9999 から来るのでしょうか?つまり starts[i]+windowsize ?

やり直して、何をしようとしているのかをよく検討し、Rの中でそれを行うための適切なツールを学ぶべきでしょう。

ETA: あなたがやろうとしていることの書き換え案です(最初に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")

これでだいたいのことはできるはずです。それ以降は自己責任でお願いします;-)