3

我希望能够传递两组按列分组的值Category。有没有办法使用ddplyfrom package来做到这一点plyr

我想做这样的事情:

ddply(idata.frame(data), .(Category), wilcox.test, data[Type=="PRE",], data[Type=="POST",])

wilcox.test是以下函数:

Description

Performs one- and two-sample Wilcoxon tests on vectors of data; the latter is also known as ‘Mann-Whitney’ test.

Usage

wilcox.test(x, ...)

Arguments

x   
numeric vector of data values. Non-finite (e.g. infinite or missing) values will be omitted.

y   
an optional numeric vector of data values: as with x non-finite values will be omitted.

.... rest of the arguments snipped ....

我有以下输出dput

structure(list(Category = c("A", "C", 
"B", "C", "D", "E", 
"C", "A", "F", "B", 
"E", "C", "C", "A", 
"C", "A", "B", "H", 
"I", "A"), Type = c("POST", "POST", 
"POST", "POST", "PRE", "POST", "POST", "PRE", "POST", 
"POST", "POST", "POST", "POST", "PRE", "PRE", "POST", 
"POST", "POST", "POST", "POST"), Value = c(1560638113, 
1283621, 561329742, 2727503, 938032, 4233577690, 0, 4209749646, 
111467236, 174667894, 1071501854, 720499, 2195611, 1117814707, 
1181525, 1493315101, 253416809, 327012982, 538595522, 3023339026
)), .Names = c("Category", "Type", "Value"), row.names = c(21406L, 
123351L, 59875L, 45186L, 126720L, 94153L, 48067L, 159371L, 54303L, 
63318L, 104100L, 58162L, 41945L, 159794L, 57757L, 178622L, 83812L, 
130655L, 30860L, 24513L), class = "data.frame")

有什么建议么?

4

2 回答 2

4

我总是做的是使用匿名函数:

ddply(idata.frame(data), .(Category), 
    function(x) wilcox.test(x[Type == "PRE",], x[Type == "POST",])

我不确定这些wilcox.test函数会返回一些很好的默认连接到 a的东西data.frame,所以你必须稍微调整一下自己。或者,使用dlply来结束wilcox.test输出列表。

于 2013-01-22T19:58:08.067 回答
2

这里有两个问题:

  1. 尽管我使用的是相同的数据,但保罗的解决方案似乎对我不起作用。我认为子集的语法是有原因的,但我没有设法破解错误。

  2. 考虑到您希望使用的结构(即Categoryx Type),您的数据实际上太小,无法通过统计测试计算任何比较。毕竟,如果您查看数据框中的类别数量,所有类别的值都少于 30 个,而一半只有一个值:

    > table(data$Category)
    A B C D E F H I 
    5 3 6 1 2 1 1 1
    

但好消息是我为你找到了解决方案。

首先,我必须生成一个更宽的表格。而且因为我(非常)懒惰,所以我只是这样做了:

for(i in 1:10){data <- rbind(data,data)}

data$Value <- jitter(data$Value,5e3) 

data$Type <- sample(c("POST","PRE"),size=nrow(data),replace=T,prob=c(0.80,0.20))

我将表格复制了 10 次,在数值中添加了噪声,并随机重新分配了“PRE”和“POST”,其比例与在初始数据帧中添加的比例相同。请注意,值本身在这里并不重要,我只是使用您提供给我们的相同数据结构。

这样,我们最终得到了一张更大的桌子,而且——更重要的是——更密集的桌子:

    > table(data$Category, data$Type)

      POST  PRE
    A 4135  985
    B 2470  602
    C 4881 1263
    D  814  210
    E 1634  414
    F  815  209
    H  846  178
    I  813  211

这样就完成了!

现在我们可以想出一个解决方案。为了清楚起见,我编写了单独执行 Wilcoxon 检验的函数。诀窍是它必须返回一个向量,该向量将被合并到输出所需的数据框中。

让我们调用函数wx

 wx <- function(d){
 w <- wilcox.test(
  # First vector (x)
    subset(d, Type == "PRE", select = Value )[,1], 
    subset(d, Type == "POST", select = Value )[,1]
      )
  # c(1,3) returns the Stat and the P-value (tweak that if you want something else)
  return(w[c(1,3)])
  }

最后,您只需将该函数应用于您的数据框:

> ddply(data, .(Category), .fun = wx  )
    Category      V1        V2
           A 2047794 0.7862484
           B  725554 0.3585648
           C 3071435 0.8459535
           D   80693 0.2112926 
           E  347314 0.3984288
           F   83304 0.6252554
           H   71762 0.3247840
           I   88874 0.4177269

当然,考虑到我构建表格的方式,没有什么是重要的,但是你在 V1 中有统计数据,在 V2 中有 P 值。

于 2013-02-14T18:32:42.150 回答