我发现自己经常不得不对数据集的子集进行多次配对比较(子集由一个或两个因素提供)。现在,我会以一种全面的方式,在一个函数中让这件事变得更容易一些。
这就是我所拥有的:
wilcox.pseudomedian <- function(x,conf.int=TRUE,na.rm=TRUE){
if(length(x) > 3){
ht <- wilcox.test(x,conf.int=conf.int,na.rm=na.rm)
return(ht$estimate[[1]])
}else{
return(NaN)
}
}
pairedwtest <- function(x,y){
ht <- wilcox.test(x,y,paired=TRUE)
out <- wilcox.reportAPA(ht)
return(out)
}
wilcox.reportAPA <- function(ht){
out <- paste(names(ht$statistic)[[1]],"=",ht$statistic,",p=",ht$p.value,sep="")
return(out)
}
然后,我希望能够以我提供的方式在数据框中应用这些函数。这就是我到目前为止所得到的......
wilcox.masstest <- function(data,factorlist,speakervar,groupvar,measurevar){
melt(data,id.vars=c(factorlist,speakervar,groupvar),measure.vars=measurevar) -> mdf
form <- as.formula(paste(paste(c(factorlist,speakervar), collapse= "+"),"~",groupvar))
outdf <- dcast(mdf, form,fun.aggregate=wilcox.pseudomedian)
outdfn <- names(outdf)
mlvls <- setdiff(outdfn,factorlist)
for(curr in 2:(length(mlvls))){
fac1 <- mlvls[curr -1 ]
fac2 <- mlvls[curr]
facname <- paste(fac1,fac2,sep="-")
facnamerev <- paste(fac2,fac1,sep="-")
ddply(outdf,factorlist,summarize,results=pairedwtest(get(fac1),get(fac2))) -> out
}
return(out)
}
..但有问题的是最后的 ddply 调用。outdf 数据框将如下所示:(最后三列是我想要迭代测试的每个数据子集内的差异,这些数据由 Patient 列之前的所有列的因子级别给出(在这种情况下))。
Task Patient Control Med OFF Med ON
115 Spontaneous P45zi 0.12044504 0.06940783 0.12044504
116 Spontaneous P46zi 0.20694651 0.13495089 0.02022240
117 Spontaneous P47zi 0.13556909 0.10433863 0.10433863
118 Spontaneous P48zi 0.07519881 0.02795007 0.12044504
119 Spontaneous P49zi 0.02022240 0.01220851 0.12044504
现在,对 ddply 的调用失败并显示
“get(fac1) 出错:找不到对象‘fac1’”
警告。如何以某种方式向 ddply 提供因子的名称,以便在进行调用时可以找到变量。我确信我可以通过将呼叫粘贴在一起然后评估文本来做到这一点,但这似乎是一个非常糟糕的主意......
有任何想法吗?