【发布时间】:2013-10-15 10:24:09
【问题描述】:
我发现自己经常需要对数据集的子集进行多次配对比较(子集由一两个因素提供)。 现在,我会以一种全面的方式,在一个函数中让这件事变得更容易一些。
这就是我所拥有的:
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 提供因子的名称,以便在进行调用时可以找到变量。我确信我可以通过将调用粘贴在一起然后评估文本来做到这一点,但这似乎是一个非常糟糕的主意......
有什么想法吗?
【问题讨论】:
-
fac1和fac2应该是 data.frameoutdf中的列。 -
确实如此,但我需要的是
fac1和fac2的contents 应该是outdf中的列名。
标签: r statistics plyr reshape2