0

我发现自己经常不得不对数据集的子集进行多次配对比较(子集由一个或两个因素提供)。现在,我会以一种全面的方式,在一个函数中让这件事变得更容易一些。

这就是我所拥有的:

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 提供因子的名称,以便在进行调用时可以找到变量。我确信我可以通过将呼叫粘贴在一起然后评估文本来做到这一点,但这似乎是一个非常糟糕的主意......

有任何想法吗?

4

1 回答 1

0

如果您还提供示例数据集,则更容易为您提供帮助。然而问题可能就这么简单:

> mlvls <- runif(20, 1,10)
> mlvls[2] 
[1] 6.617676
> mlvls[3] 
[1] 6.788338
> fac1 <- mlvls[2] 
> fac2 <- mlvls[3]
> get(fac1)          # will not work
Fehler in get(fac1) : ungültiges erstes Argument
> get("fac2")        # will work
[1] 6.788338
于 2013-11-02T13:54:31.343 回答