生化学でPCRをやっています。ExcelでプライマーのTm値の計算をやりたいですが、どういった計算式を書いていいかわかりません。

計算したい内容はたとえば「atccggata」というようなATCGからなるランダムな配列があったとして、これのA,Tの数、G,Cの数をカウントして、以下のような計算をしたいです。
文字列の長さ(n)が17以上なら→4×(G+C)+2×(A+T)

文字列の長さ(n)が18以上なら→60.8+41×(G+C)/n-(500/n)

という計算です。
上記の例の場合、n=9,G+C=4,A+T=5なので、26になるはずです。
「ggcatagacatttacaggcc」ならn=20,GC=10,AT=10で56.3となる計算です。

状況としては、プライマーの配列がExcelに150個ほどあって、それに関していちいちGenetyxなどでTm値計算するのが面倒ということです。面倒くさがりといえばそうなのですが、なにかうまいやり方をご教授いただけたらと思います。ちなみに私、マクロに関しては「そういうものがある」ぐらいしか知識がありませんもので、もしマクロを使う必要があるならばコードなどを書いていただけたらありがたいです。よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/06/20 10:01:13
  • 終了:2007/06/20 14:36:56

ベストアンサー

id:taknt No.1

きゃづみぃ回答回数13537ベストアンサー獲得回数11982007/06/20 10:17:51

ポイント80pt

A1に「atccggata」があったとして 以下で どうでしょうか?

=IF(LEN(A1)<=17,LEN(A1)*12-LEN(SUBSTITUTE(A1,"g",""))*4-LEN(SUBSTITUTE(A1,"c",""))*4-LEN(SUBSTITUTE(A1,"a",""))*2-LEN(SUBSTITUTE(A1,"t",""))*2,60.8+41*(LEN(A1)-LEN(SUBSTITUTE(A1,"g",""))+LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))/LEN(A1)-(500/LEN(A1)))

ちなみに

文字列の長さ(n)が17以上なら

文字列の長さ(n)が18以上なら

とありますが

17文字以下ならば としました。

もし 17文字以上ならば 18文字のときは どちらの計算式になるのか 不明だからです。


あと

LEN(A1)-LEN(SUBSTITUTE(A1,"a",""))

が a の文字数となります。

これを 使えば 計算式を組み立てるのは 簡単ですよね。

id:cacataga

あ、すいません17以下でしたね。

さっそく試してみました。

おおおお!できた!!

ありがとうございました!!

2007/06/20 14:15:23

その他の回答(3件)

id:taknt No.1

きゃづみぃ回答回数13537ベストアンサー獲得回数11982007/06/20 10:17:51ここでベストアンサー

ポイント80pt

A1に「atccggata」があったとして 以下で どうでしょうか?

=IF(LEN(A1)<=17,LEN(A1)*12-LEN(SUBSTITUTE(A1,"g",""))*4-LEN(SUBSTITUTE(A1,"c",""))*4-LEN(SUBSTITUTE(A1,"a",""))*2-LEN(SUBSTITUTE(A1,"t",""))*2,60.8+41*(LEN(A1)-LEN(SUBSTITUTE(A1,"g",""))+LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))/LEN(A1)-(500/LEN(A1)))

ちなみに

文字列の長さ(n)が17以上なら

文字列の長さ(n)が18以上なら

とありますが

17文字以下ならば としました。

もし 17文字以上ならば 18文字のときは どちらの計算式になるのか 不明だからです。


あと

LEN(A1)-LEN(SUBSTITUTE(A1,"a",""))

が a の文字数となります。

これを 使えば 計算式を組み立てるのは 簡単ですよね。

id:cacataga

あ、すいません17以下でしたね。

さっそく試してみました。

おおおお!できた!!

ありがとうございました!!

2007/06/20 14:15:23
id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692007/06/20 10:54:56

ポイント10pt

マクロは得意じゃないということで関数で無理やり書いてみます。

データが入ったセルをA1として

=IF(LEN(A1)>17,60.8+41*(LEN(A1)-LEN(SUBSTITUTE(SUBSTITUTE(A1,"c",""),"g","")))/LEN(A1)-(500/LEN(A1)),60.8+41*(LEN(A1)-LEN(SUBSTITUTE(SUBSTITUTE(A1,"c",""),"g","")))/LEN(A1)-(500/LEN(A1)))
id:cacataga

ありがとうございました。

私の質問が間違えていたこともあるのですが、これですと17以下の時の計算が違うようです。

2007/06/20 14:18:03
id:ritchiekotzen No.3

ritchiekotzen回答回数1ベストアンサー獲得回数02007/06/20 11:13:20

ポイント15pt

生化学のことはよく分かりませんが、Excelは仕事柄よく使ってます。マクロなんて使わずにできますよ。

先ず、調べたい配列をセルB2におきます。そして、以下のセルにそれぞれ以下の計算式を書きます。

セルB3(配列の長さ):=LEN(B2)

セルB4(Aの数):=B3-LEN(SUBSTITUTE(B2,"A",""))

セルB5(Tの数):=B3-LEN(SUBSTITUTE(B2,"T",""))

セルB6(Gの数):=B3-LEN(SUBSTITUTE(B2,"G",""))

セルB7(Cの数):=B3-LEN(SUBSTITUTE(B2,"C",""))

そうすると、「プライマーのTm値」は以下の式で求まります。

=IF(B3>17,60.8+41*(B6+B7)/B3-(500/B3),4*(B6+B7)+2*(B4+B5))

なお、上の式だと、B2には全て大文字で配列を記入しなければなりません。小文字を大文字にするには「upper」関数を使ってください。(B2にupper(小文字の配列)と書く。)

id:cacataga

なるほど、これでもできました。

基本的にLEN(SUBSTITUTE())を使うのですね。

ありがとうございました。

2007/06/20 14:28:27
id:castiron No.4

castiron回答回数418ベストアンサー獲得回数302007/06/20 11:17:54

ポイント20pt

常連さんが回答しているからそれよりスマートでないのは分かっていますが

自分の勉強がてら作ってみました。

とすればTm値が出ます。

これを

ツール→マクロ→Visual Basic Editor

(Alt+Shift+F11でも可)

VBEが起動したら

挿入→標準モジュールを選択

以下をコピー&ペースト

マクロというかユーザー定義の関数ですね。

=Tm(Tm値を出したいセル)

例)A列にGenetyxがあるなら

=Tm(A1)

A1のTm値が出ます。

Function Tm(Genetyx As String)

Dim a, t, g, c, num As Integer

a = 0

t = 0

g = 0

c = 0

num = InStr(Genetyx, "a")

Do While num <> 0

a = a + 1

num = InStr(num + 1, Genetyx, "a")

Loop

num = InStr(Genetyx, "t")

Do While num <> 0

t = t + 1

num = InStr(num + 1, Genetyx, "t")

Loop

num = InStr(Genetyx, "g")

Do While num <> 0

g = g + 1

num = InStr(num + 1, Genetyx, "g")

Loop

num = InStr(Genetyx, "c")

Do While num <> 0

c = c + 1

num = InStr(num + 1, Genetyx, "c")

Loop

n = Len(Genetyx)

If n < 18 Then

Tm = 4 * (g + c) + 2 * (a + t)

Else

Tm = 60.8 + 41 * CLng(g + c) / n - (500 / CLng(n))

End If

End Function

よろしければコメントを開けてもらえませんか?

id:cacataga

回答ありがとうございます。

マクロを使うとこうなるのですね。

やってみましたところ、正しく計算できました。

なんとなくしかわかりませんがマクロの勉強になりました。

2007/06/20 14:34:57
  • id:castiron
    =LEN()-LEN(SUBSUTITUTE())
    というのがセル内の特定文字を数えるテクニックだったんですね。
    やっぱり内蔵されている関数について熟知していないと無駄なマクロや関数を書くことになるんですね・・・
    VBでは条件式の部分で
    (num=InStr(Genetyx,"a"))<>0
    というのは無理なんですかね?
    (=が代入演算子ではなく比較演算子になってしまう?)
  • id:taknt
    >VBでは条件式の部分で
    (num=InStr(Genetyx,"a"))<>0
    というのは無理なんですかね?

    条件のところで 代入は できないですね。

    ただ、関数を 条件に使うことは 可能です。

    その関数内で代入ということは できます。

  • id:SALINGER
    >17以下の時の計算が違うようです。
    takntさんと見比べると最初の等式が LEN(A1)<=17 で逆でしたね。
    というか、takntさんと同じもの作ったつもりだったが、間違ってコピペしたようね。
  • id:castiron
    takntさんありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません