我有一个相对简单的问题,我认为我没有正确使用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]
等
最有效的方法是什么?
提前致谢!
答案 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])