1

関数をデータ フレームのリストに適用する際に厄介な問題があります。最終的には、薬物使用量の大規模なデータ セットの個別の時系列グラフをプロットしたいと考えています。

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

これまでのところ、各抗生物質クラスの個々のデータ フレームのリストを作成しました。(リストの名前は drug および 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
    }
}

以前に個々のデータ フレームですべての関数をテストしましたが、期待どおりに動作します。

薬物リストの各データ フレームにテストを適用する方法を考え出そうとしています。これを解決する助けが得られれば、時系列関数を同じ方法で適用できるようになると思います。

提供された支援について事前に感謝します。

4

1 に答える 1

1

いくつかの提案:

acTestパラメータとして data.frame を実際に受け入れるように関数を変更します。そうしないと、グローバル環境で 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
    }
}

リストの各要素に関数を適用することは、R では一般的なタスクです。(ほとんどの場合) を使用して行われlapplyます。

lapply(drugList,FUN=acTest)

Finally, you can do tasks like this without storing each data frame as a separate list element by using tools like ddply(among others) that split a data frame using one variable, apply a function to each piece and then reassemble them into a single data frameまた。あなたの場合、それは次のようになります。

ddply(AB,.(Drug),.fun = acTest)
于 2011-07-06T02:51:11.600 に答える