条件测试后,列表中数据帧的多个图

时间:2011-07-06 01:20:11

标签: r loops lapply

将函数应用于数据帧列表时遇到了一个棘手的问题。最后,我想绘制大量药物使用数据的个人时间序列图表。

我的数据集包含30种不同的抗生素,使用率在5年内每月收集一次。它有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
    }
}

我之前在各个数据框架上测试了所有功能,它们按预期工作。

我正在尝试研究如何将测试应用于药物清单中的每个数据框。我相信如果我能得到帮助,我将能够以同样的方式应用时间序列函数。

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分: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)

最后,您可以通过使用ddply(以及其他)使用一个变量分割数据框的工具,将每个数据框作为单独的列表元素存储,从而执行此类任务,将函数应用于每个部分,然后再将它们重新组合成一个数据帧。在您的情况下,这看起来像:

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