我是R的新手,我想做一些非常简单的事情,但我需要帮助。
我有一个类似于上面的数据库,其中spot number =蛋白质的"name“,grupo =I和II组和APF =荧光读数。我想通过比较I组和II组,但在一个循环中,对每种蛋白质做一次学生测试。
在上面的数据库中,只有一个蛋白质(147),但在我真正的数据库中,我有444个蛋白质。
发布于 2015-07-18 22:25:13
首先是一些假数据:
set.seed(0)
Spot.number <- rep(147:149, each=10)
grupo <- rep(rep(1:2, each=5), 3)
APF <- rnorm(30)
gel <- data.frame(Spot.number, grupo, APF)
> head(gel)
Spot.number grupo APF
1 147 1 2.1780699
2 147 1 -0.2609347
3 147 1 -1.6125236
4 147 1 1.7863384
5 147 1 2.0325473
6 147 2 0.6261739
您可以使用lapply
循环gel
的子集,并由Spot.number
拆分。
tests <- lapply(split(gel, gel$Spot.number), function(spot) t.test(APF ~ grupo, spot))
或者只是
tests <- by(gel, gel$Spot.number, function(spot) t.test(APF ~ grupo, spot))
然后,您可以转到例如,只取p值:
sapply(tests, "[[", "p.value")
# 147 148 149
#0.2941609 0.9723856 0.5726007
或置信区间
sapply(tests, "[[", "conf.int")
# 147 148 149
# [1,] -0.985218 -1.033815 -0.8748502
# [2,] 2.712395 1.066340 1.4240488
得到的向量或矩阵已经有了Spot.number
作为名称,这是非常有用的。
发布于 2015-07-18 19:43:16
您可以使用t.test和my 扫帚包在每个组中执行一个扫帚。如果您的数据存储在一个名为dat
的数据框架中,您可以这样做:
library(dplyr)
library(broom)
results <- dat %>%
group_by(Spot.number) %>%
do(tidy(t.test(APF ~ grupo, .)))
这可以通过对由t.test(APF ~ grupo, .)
定义的每个组执行Spot.number
。然后,tidy
函数将其转换为一行数据帧,以便重新组合。然后,results
数据框架将包含每种蛋白质一行(Spot.number
),列包括estimate
、statistic
和p.value
。
有关dplyr和broom组合的更多信息,请参见这个小故事。
https://stackoverflow.com/questions/31493893
复制相似问题