2011-07-06 1 views
1

データフレームのリストに関数を適用するのに厄介な問題があります。最終的に私は、薬物使用量の大きなデータセットのための個々の時系列チャートをプロットしたいと思います。条件付きテストの後のリスト内のデータフレームからの複数のプロット

私のデータセットは、5年間にわたって毎月収集された使用率の30種類の抗生物質から構成されています。それは3列と1692行を持っています。

これまでのところ、私は各抗生物質クラスの個々のデータフレームのリストを作成しました。 (リストの名前は、薬物であり、drug.classは、元のデータフレームからの薬物名の文字ベクトルである)

drugList <- list() 
n<-length(drug.class) 
for (i in 1:n){ 
    drugList[[i]] <-AB[Drug==(drug.class[i]),] 
} 

は、例えば、私は、次の列を持つリスト30個のデータフレームを有する:

[[29]] 
      Drug Usage  DateA 
1353 Tobramycin 5.06 01-Jan-2006 
1354 Tobramycin 4.21 01-Feb-2006 
1355 Tobramycin 6.34 01-Mar-2006 
. 
. 
. 
      Drug Usage  DateA 
678 Vancomycin 11.62 01-Jan-2006 
679 Vancomycin 11.94 01-Feb-2006 
680 Vancomycin 14.29 01-Mar-2006 

各プロットが作成される前に、論理テストが実行され、時系列が自己相関するかどうかが判定されます。リスト内のデータフレームは非常に長いものです。 次のように私はテストを実行する機能を書かれている:私は以前に個々のデータフレームにすべての私の機能をテストしている

acTest <- function(){ 
    id<-ts(1:length(DateA)) 
    a1<-ts(Usage) 
    a2<-lag(a1-1) 
    tg<-ts.union(a1,id,a2) 
    mg<-lm(a1~a2+bs(id,df=3), data=tg) 
    a2Pval <- summary(mg)$coefficients[2, 4] 
    if (a2Pval<=0.05) { 
     TRUE 
    } else { 
     FALSE 
    } 
} 

と期待どおりに動作します。

私は、薬物リストの各データフレームにどのようにテストを適用するかを検討しています。私はこれを手助けすることができれば、私は同じ方法で時系列関数を適用する立場にいると信じています。

ご協力いただきありがとうございます。

答えて

1

いくつかの提案:それは実際にパラメータとしてdata.frameを受け入れるよう

はあなたの acTest機能を変更

。さもなければ、グローバル環境でDateAとUsageという名前のオブジェクトを探して(そして変更する)関数に多くの問題があります。リストの各要素に関数を適用

acTest <- function(dat){ 
    id<-ts(1:length(dat$DateA)) 
    a1<-ts(dat$Usage) 
    a2<-lag(a1-1) 
    tg<-ts.union(a1,id,a2) 
    mg<-lm(a1~a2+bs(id,df=3), data=tg) 
    a2Pval <- summary(mg)$coefficients[2, 4] 
    if (a2Pval<=0.05) { 
     TRUE 
    } else { 
     FALSE 
    } 
} 

は、それは(ほとんどの場合)lapplyを使用して行われるR.における共通の課題です。

lapply(drugList,FUN=acTest) 

最後に、あなたは一つの変数を使用して、データフレームを分割する(とりわけ)ddplyのようなツールを使って、別のリストの要素として、各データフレームを格納することなく、このような作業を行うことができ、各部分に関数を適用し、再度それらを1つのデータフレームに再構成します。あなたの場合、それは次のようになります:

ddply(AB,.(Drug),.fun = acTest) 
+0

ありがとうございます。完璧に動作します。 – John

関連する問題