No.14203 Rでの多変量のパーセントの出し方  【taipapa】 2011/01/23(Sun) 22:46

いつもお世話になっております.
113種類の検体を,処理前,10分後,20分後,30分後の4ポイントで調べています.これを,2種類の採取方法で行っています.つまり,113x4x2=904個のデータです.
データは,

PeakNo. RT QuantMS Compound_Name variable value
1 159 258.9000 114 n-Propylamine J0 0.0111938548
2 185 269.9500 152 2-Hydroxypyridine J0 0.0207955297
3 210 275.3000 174 Pyruvate+Oxalacetic acid J0 0.0229141617
4 231 281.3500 117 Lactic acid J0 2.4815061792
5 286 293.3000 177 Glycolic acid J0 0.0025013220
6 300 296.8500 116 N-Methylethanolamine J0 0.0042268023
7 337 308.9000 174 Isobutylamine J0 0.0055186345
8 356 311.9500 116 Alanine(2TMS) J0 1.1451084002
9 390 316.4500 86 n-Butylamine J0 0.0040951893
10 429 324.9000 204 Glycine(2TMS) J0 0.0005645860
11 449 327.3500 131 HydroxyButyrate J0 0.1699646973
12 463 331.1000 149 Oxalate J0 0.0019043389
13 470 333.4500 202 Ketovaline_2 J0 0.0026049251
14 485 336.0000 116 Sarcosine J0 0.0031026922
15 513 338.6000 204 2-Aminoisobutyrate J0 0.0018618178
16 564 350.2500 147 3-Hydroxy-Butyrate J0 0.3068388480
17 605 358.4500 204 2-Aminobutyric acid J0 0.0030034763
18 631 363.0500 89 Ketoisoleucine_1 J0 0.0048548325
19 689 376.0500 200 Ketoisoleucine_2 J0 0.0005801096
20 715 383.0500 247 3-Hydroxyisovaleric acid J0 0.0006300551
..........

こ のようにlong typeになっておりまして,J0は処理前の時間ポイントを意味します.たとえば,最初にあるn-Propylamineの次の時間ポイント(J10とし てます)が出てくるのは,114行目になります.そして,処理後の変動は,処理前のパーセントで表示したいのです.これを行うのにスマートな方法が分から ず,以下のようにしました.ソフトはRを使用しております.

1行目から113行目までは第1の方法の各検体の処理前の値,それ以降,452行までは第1の方法の処理後の結果なので,
> a <- Data.df$value[1:452]*100/Data.df$value[1:113]

453行目から565行目までは第2の方法の各検体の処理前の値,それ以降,904行までは第2の方法の処理後の結果なので,
> b <- Data.df$value[453:904]*100/Data.df$value[453:565]

これで処理前の値は,すべて100%で,処理後は処理前に対する%で表されます.
2つをくっつけて,
> A <- list(c(a,b))
データフレームにして,
> A.df <- data.frame(A)
元のデータフレームに新たな変数として追加しました.
> Data.df$percent_change <- A.df$percent_change

こ れで,目的は達せられたのですが,あまりに無様な方法なので,もっとスマートな方法があるはずと色々調べては見たのですが,よく分かりませんでした.上記 のデータは,1個人のもので,これからおそらく数十人分調べることになりそうなので,より簡便な方法をご教示いただければ幸いです.

No.14205 Re: Rでの多変量のパーセントの出し方  【青木繁伸】 2011/01/24(Mon) 01:42

データのある列を取り出し,3 次元配列にして apply で計算して,計算結果をベクトルに戻してデータフレームの列を作る。
Data.df の value 列に n 人分のデータがあるとしたら
Data.df$value2 <- as.vector(
apply(array(Data.df$value, dim=c(113, 4, nrow(Data.df)/(113*4))),
3,
function(y) as.vector(y/y[,1]))
)*100

No.14212 Re: Rでの多変量のパーセントの出し方  【taipapa】 2011/01/24(Mon) 19:10

青木先生,深夜にお返事を頂いていたようで,恐縮です.
今,手元にRがないのですが,明日にでもご教示いただいた方法でやってみます.
いつも本当に有り難うございます.

No.14224 Re: Rでの多変量のパーセントの出し方  【taipapa】 2011/01/26(Wed) 00:07

やってみました.
お陰様でうまくできました.
なるほど,3次元配列なので,applyのsubscriptは3になるわけですね.(ですよね?)
納得できました.いつになったら私もこんな風にスマートにRが使えるようになることやら.
青木先生,重ねて有り難うございました.

● 「統計学関連なんでもあり」の過去ログ--- 044 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る