2016-07-14 14 views
0

私は241列と114行のdfを持っています。列60:241は数値であり、変数グループ(T1およびT2)に従ってペアt検定を実行したいと考えています。個々の変数については、reshape2パッケージのacastコマンドとt.testを使ってこれを行うことができましたが、私はこれを182個の変数すべてに対して自動的に実行するコマンドを見つけることができました。複数の自動生成されたデータフレームでt.testを実行しますか?

私はコードに何をしたいの簡単な例を作ってみました:

> df 
    PatientID Group Immvar1 Immvar2 
1   1 T1  4  5 
2   2 T1  7  8 
3   2 T2  9  10 
4   3 T1  2  3 
5   3 T2  4  5 
6   4 T1  1  2 
7   4 T2  9  10 

> df1 <- as.data.frame(acast(df$PatientID ~df$Group, data = df, fill=0, value.var=("Immvar1"))) 
> df1 
    T1 T2 
1 4 0 
2 7 9 
3 2 4 
4 1 9 
> t.test(df1$T1,df1$T2, paired=TRUE) 

私はすでに次のようにこの実行が自動的に見えるようにするために構成されたコード:

df2 <-df[,3:4] 
modelList<-list() 
for (i in 1:ncol(df2)) { 
    matrix <- formula(paste("as.data.frame(acast(PatientID ~ Group , data = df1, fill=0, value.var=(", names(df2[i]),")))")) 
    modelList[[i]] <-t.test(matrix$T1, matrix$T2, paired=TRUE) 
} 

をしかし、私は常に取得

一致するエラー(x、table、nomatch = 0L):オブジェクト 'Immvar1'が見つかりません

多分私はこれと全く違うアプローチにしなければならないかもしれませんし、このような操作には適していないモデリスト/式の組み合わせです。誰もがこの仕事をするアイディアを持っていますか?

答えて

2

私はあなたの式/ペーストラインが問題だと思います。キャスト関数を直接呼び出す必要があります。 (そして、dcastはそれを自動的にdata.frameに入れます)再現可能な例がなければ、私はこれをテストすることはできませんが、そのように見えるものはここにあります。私はまた、lapplyを使って簿記の世話をします。

results <- lapply(names(df)[3:4], function(n) { 
    matrix <- dcast(PatientID ~ Group, data = df, fill=0, value.var=n) 
    t.test(matrix$T1, matrix$T2, paired=TRUE) 
}) 

また、欠落した行に0を入力してもよろしいですか?通常、値が不明な場合は値が不明です。

キャストを避けることを他の方法として考えているのは、t.testの式の表記を使用することです(ペアになっている値を並べる必要があるため、欠損値が問題になります)。または、Anova on two- GroupとPatientID(これは同等です)。

テストの結果を収集するには、出力から必要な部分を収集する必要があります。 str(tmp)またはunclass(tmp)を実行して、出力が実際にどのように見えるかを確認します。これはリストなので、必要な部分を個別に$を使用して集めるか、または一緒に[を使用してリストから除外することができます。マトリックスに入れるには、rbindを一緒にする必要があります。また、バインドしたい要素がすでにリストに入っているので、do.callを使用します。例えば、

tmp <- lapply(results, function(x) unlist(x[c("statistic", "parameter", 
       "p.value", "conf.int", "estimate")])) 
as.data.frame(do.call(rbind, tmp)) 

ハドレーウィックハムの様々なパッケージは、この「分割適用結合」を行う代替方法を提供する。 meltからreshape2ddplyからplyrまでは、私がこれらのパッケージを使用した場合に使用するものですが、ここで行ったようにベースRの使用には何も問題ありません。

+0

非常にありがとうございます!いくつかの変更の後、それは私の元のデータセットにも作用しました!本当に素晴らしいと私は多くの仕事を節約!実際、あなたはもちろん、NA対0についてはまったく正しいです。私はあなたがそれを行う簡単な方法を知っているかどうかはわかりませんが、Rがt.testの結果をすごく優しい方法?私は線形回帰を実行するときにパッケージのほうきからきちんとした目を使っていますが、t.testの代替案はわかりません。 –

+0

私はunlist(tmp [..]をunlist(x [...でコードに入れておいて、これはうまくいく!)を置き換えなければならないと思う!!これは私の他のスクリプトもたくさん適用できるコマンドです。もう一度! –

+0

固定、ありがとう.. – Aaron

関連する問題