1

我在将函数应用于数据框列表时遇到了一个棘手的问题。最终,我想为大量药物使用数据集绘制单独的时间序列图表。

我的数据集包含 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
    }
}

我之前已经在单个数据帧上测试了我的所有功能,它们按预期工作。

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

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

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)

最后,您可以执行这样的任务,而无需将每个数据帧存储为单独的列表元素,方法是使用ddply(除其他外)使用一个变量拆分数据帧,将函数应用于每个片段,然后将它们重新组合成单​​个数据帧的工具再次。在你的情况下,这看起来像:

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