我尝试对数据框中的不同组执行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
答案 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 = "_")