2011-07-06 52 views
1

將函數應用於數據框列表時存在一個棘手的問題。最終,我想繪製個人時間序列圖表,用於大數據集的藥物使用數據。在條件測試後從列表中的數據幀中獲取多個圖

我的數據集包含30種不同的抗生素,使用率在5年內每月收集一次。它有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 

每個地塊之前是由邏輯進行測試以確定時間序列自相關的。列表中的數據frmaes非常長。 我寫一個函數來執行測試如下:

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 
    } 
} 

應用到列表中的每個元素的功能是在R的共同任務是(最常見),使用lapply完成。

lapply(drugList,FUN=acTest) 

最後,可以做這樣的任務,而無需使用像ddply工具(除了別的以外),該分割利用一個變量的數據幀存儲每個數據幀作爲一個單獨的列表元素,應用一個函數到每個片和然後再將它們重新組裝爲一個數據框。在你的情況,這看起來像這樣:

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

謝謝喬蘭。完美的作品。 – John

相關問題