对R数据帧的选定列进行t检验

时间:2014-03-16 04:03:49

标签: r plyr apply

我有一个相对简单的问题,我认为我没有正确使用R。

我有一个数据框,其中有几个观察结果,存储在行中,以及一堆我不想丢失的注释,在同一数据框的其他列中。

我想对数据框的几列中的值进行t检验,并将结果写入(理想情况下)相同的数据框。

一个简单的例子是:

# Generate the data
experimentName <- paste(rep("name",20), c(1:20), sep="")
experimentAnno1 <- rep(paste(rep("anno",5), c(1:5), sep=""), 4)
a1 <- rnorm(n=20, mean=10, sd=5)
a2 <- rnorm(n=20, mean=11, sd=5)
a3 <- rnorm(n=20, mean=12, sd=5)
b1 <- rnorm(n=20, mean=20, sd=5)
b2 <- rnorm(n=20, mean=21, sd=5)
b3 <- rnorm(n=20, mean=19, sd=5)

sampledata <- cbind(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)

所以我尝试了一个非常简单的

ttestfun = function(x) t.test(x[,c("a1", "a2", "a3")], x[,c("b1", "b2", "b3")])$p.value
p.value = apply(sampledata, 1, ttestfun)

哪个不起作用:(

我也尝试了一大堆by(),melt(),apply()等的组合 - 所有这些我认为我做错了。

我希望得到的结果是采样数据框中的附加列是:

# pValue
p.value
# LoConf
a$conf.int[1]
# UpConf
a$conf.int[2]

最有效的方法是什么?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您需要先sampledata一个data.frame,才能在&#34; a&#34;中获取数值。和&#34; b&#34;列。

> sampledata <- data.frame(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)

如果您尝试基于Welch双样本t检验获得每行统计数据,这种方式很快且相对简单。

> stats <- as.data.frame(do.call(rbind, lapply(1:nrow(sampledata), function(i){
    as.numeric(unlist(t.test(sampledata[i, 3:5], sampledata[i, 6:8]))[1:5])
    })))
> names(stats) <- c("t.stat", "param.df", "p.val", "ci.left", "ci.right")
> cbind(sampledata, stats)

答案 1 :(得分:1)

可能 效率最高,但这是建立在您最初努力基础上的一种方式。

您的示例数据:

experimentName <- paste(rep("name",20), c(1:20), sep="")
experimentAnno1 <- rep(paste(rep("anno",5), c(1:5), sep=""), 4)
a1 <- rnorm(n=20, mean=10, sd=5)
a2 <- rnorm(n=20, mean=11, sd=5)
a3 <- rnorm(n=20, mean=12, sd=5)
b1 <- rnorm(n=20, mean=20, sd=5)
b2 <- rnorm(n=20, mean=21, sd=5)
b3 <- rnorm(n=20, mean=19, sd=5)

我使用的是data.frame而不是cbind,因此我们可以将这些数字保留为数字(cbind强制他们加入角色)

# sampledata <- cbind(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)
sampledata <- data.frame(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)

似乎你的目标是在每一行内,a1,a2,a3的测试集,对照b1,b2,b3的集合

以下是一些获取这些值的lapply函数:

sampledata$pvalue <- sapply(1:nrow(sampledata), function(i) t.test(sampledata[i,c("a1", "a2", "a3")], sampledata[i,c("b1", "b2", "b3")])$p.value)

sampledata$LoConf <- sapply(1:nrow(sampledata), function(i) t.test(sampledata[i,c("a1", "a2", "a3")], sampledata[i,c("b1", "b2", "b3")])$conf.int[1])

sampledata$UpConf <- sapply(1:nrow(sampledata), function(i) t.test(sampledata[i,c("a1", "a2", "a3")], sampledata[i,c("b1", "b2", "b3")])$conf.int[2])