我在R中有一个数据帧名称R_alltemp,有6列,2组数据,每组3个重复。我正在尝试对前三个值和后三个值之间的每一行执行t检验,并使用apply(),以便它可以通过一行遍历所有行。这是我到目前为止使用的代码。
R_alltemp$p.value<-apply(R_all3,1, function (x) t.test(x(R_alltemp[,1:3]), x(R_alltemp[,4:6]))$p.value)
这是表格的快照
R1.HCC827 R2.HCC827 R3.HCC827 R1.nci.h1975 R2.nci.h1975 R3.nci.h1975 p.value
1 13.587632 22.225083 15.074230 58.187465 79 82.287573 0.4391160
2 2.717526 1.778007 1.773439 1.763257 2 1.679338 0.4186339
3 203.814478 191.135711 232.320487 253.908939 263 263.656100 0.4904493
4 44.386264 45.339169 54.089884 3.526513 3 5.877684 0.3095634
它起作用了,但是从眼球看来它的p值似乎是错误的。例如,在第一行中,第一组的平均值低于第二组,但我的p值仅为.4。
我觉得我在这里错过了一些非常明显的东西,但是我一直在努力争取它比我想要的更长。任何帮助将不胜感激。
答案 0 :(得分:2)
您的代码不正确。我实际上不明白为什么它不会返回错误。特别是这一部分:x(R_alltemp[,1:3])
应为x[1:3]
。
这应该是你的代码:
R_alltemp$p.value2 <- apply(R_alltemp, 1, function(x) t.test(x[1:3], x[4:6])$p.value)
R1.HCC827 R2.HCC827 R3.HCC827 R1.nci.h1975 R2.nci.h1975 R3.nci.h1975 p.value p.value2
1 13.587632 22.225083 15.074230 58.187465 79 82.287573 0.4391160 0.010595829
2 2.717526 1.778007 1.773439 1.763257 2 1.679338 0.4186339 0.477533387
3 203.814478 191.135711 232.320487 253.908939 263 263.656100 0.4904493 0.044883436
4 44.386264 45.339169 54.089884 3.526513 3 5.877684 0.3095634 0.002853154
请记住,通过指定1
,您正在告诉申请获取列。因此,function(x)
会返回与此相同的内容:x <- c(13.587632, 22.225083, 15.074230, 58.187465, 79, 82.287573)
,这意味着您要将前三个值按x[1:3]
进行子集,然后将最后三个值x[4:6]
进行对,并应用t.test
给他们。
使用apply
之前的一个好主意是手动测试该功能,所以如果你得到这些奇怪的结果,你就会知道你的代码出了问题。
答案 1 :(得分:1)
因此第一行的双尾p值应为:
> g1 <- c(13.587632, 22.225083, 15.074230)
> g2 <- c(58.187465, 79, 82.287573)
> t.test(g1,g2)$p.value
[1] 0.01059583
在所有行中应用该函数(我在最后添加了新的p-val pval
:
> tt$pval <- apply(tt,1,function(x) t.test(x[1:3],x[4:6])$p.value)
> tt
R1.HCC827 R2.HCC827 R3.HCC827 R1.nci.h1975 R2.nci.h1975 R3.nci.h1975 p.value pval
1 13.587632 22.225083 15.074230 58.187465 79 82.287573 0.4391160 0.010595829
2 2.717526 1.778007 1.773439 1.763257 2 1.679338 0.4186339 0.477533387
3 203.814478 191.135711 232.320487 253.908939 263 263.656100 0.4904493 0.044883436
4 44.386264 45.339169 54.089884 3.526513 3 5.877684 0.3095634 0.002853154
也许是在函数中重复使用数据框名称(你不需要)?