人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

生化学で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値計算するのが面倒ということです。面倒くさがりといえばそうなのですが、なにかうまいやり方をご教授いただけたらと思います。ちなみに私、マクロに関しては「そういうものがある」ぐらいしか知識がありませんもので、もしマクロを使う必要があるならばコードなどを書いていただけたらありがたいです。よろしくお願いします。

●質問者: cacataga
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:AT Excel G+ GC PCR
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●80ポイント ベストアンサー

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 の文字数となります。

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

◎質問者からの返答

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

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

おおおお!できた!!

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


2 ● SALINGER
●10ポイント

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

データが入ったセルを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)))
◎質問者からの返答

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

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


3 ● ritchiekotzen
●15ポイント

生化学のことはよく分かりませんが、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(小文字の配列)と書く。)

◎質問者からの返答

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

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

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


4 ● castiron
●20ポイント

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

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

とすれば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

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

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ