在一列中具有多个组的多个列上进行配对T检验

时间:2018-03-08 13:54:05

标签: r

我尝试对数据框中的不同组执行t检验,并使用" by"并且" tapply",但没有希望得到结果。

我想对WX,WY,WZ,XY,XZ,YZ之间的每组进行t检验(A列,groep" a"," b"等) (所以所有的数字列)。有任何想法吗? (这只是较大数据集的一个子集)

    A    W      X            Y           Z
1   a   14.0172078  18.7937412  12.277694   16.495175
2   b   6.4176057   -1.8144339  23.0486318  20.142247
3   c   7.8428355   11.9658603  20.9157432  28.58746
4   d   11.8247032  12.8296893  7.8272113   14.358526
5   a   4.2657065   4.7800481   11.5508486  25.431231
6   b   7.883498    15.1155665  20.8919482  26.529425
7   c   11.2701012  7.4366799   5.0557006   15.058677
8   d   18.7653033  10.2386834  8.2821184   18.86291

1 个答案:

答案 0 :(得分:0)

我在这里创建了一个像你这样的数据框:

df <- data.frame(A = rep(letters[1:4], 10), W = rnorm(40), X = rnorm(40), Y = rnorm(40), Z = rnorm(40))

现在获取您感兴趣的列的所有可能的双向组合

cm <- combn(colnames(df[,2:5]), 2)
cm

您可以通过A列将数据框拆分为列表,然后对每个2way列组合应用配对t检验:

res <- lapply(split(df, df$A), function(x) 
              apply(cm, 2, function(y) t.test(x[,y[1]], x[,y[2]], paired = T)))

请注意,您的结果现在位于列表列表中(A中每个类别一个,每个子列表的长度由列组合数决定)

str(res, max.level = 1)

要获得结果,例如。 pvalue,您可以浏览以下列表:

sapply(res, function(x) sapply(x, function(y) y$p.value))

并使用cm作为rownames,例如

apply(cm, 2, paste, collapse = "_")