1

我正在尝试对数据框的每一列运行统计测试并将结果保存到文件中。我有两个问题:

  1. 有没有办法使用 apply 而不是 for 循环来做到这一点?和
  2. 我可以将所有测试的结果保存到一个文件中吗?

给定一个玩具数据框:

DataFrame <- data.frame(Treatment= rep(c("A", "B", "C"), each = 6),
             A=sample(1:100, 18), 
             B=sample(1:100, 18), 
             C=sample(1:100, 18))

到目前为止,我已经完成了这个,它运行了我想要的测试(在这种情况下是成对的 t 测试,但我对其他测试做同样的事情),但将每个测试的结果保存到一个单独的文件中:

library(MASS)
Col_pairwise.t.test <- function(data.frame){DataFrame <- data.frame
 for (i in 2:length(DataFrame)){
   i_test <- pairwise.t.test(DataFrame[ ,i], DataFrame$Treatment, p.adj = "none")

   write.matrix(i_test$p.value, file = paste(colnames(DataFrame[i]), 
     +   "_t_test.txt", sep = ""), sep="\t")
}}
Col_pairwise.t.test(DataFrame)

我可以使用 apply 而不是 for 循环来运行测试,但是当我这样做时不知道如何将 p 值保存到文件中:

apply(DataFrame[ , 2:4], 2, pairwise.t.test, g=DataFrame$Treatment, p.adj = "none")

我对 R 还是很陌生,任何帮助都将不胜感激!我确信有一种更好的方法可以用 apply 而不是 for 循环来做我已经在做的事情,而且我知道必须有一种方法来存储 t 测试的所有结果并将它们写入文件结束,我只是不知道它是什么。
谢谢!

4

2 回答 2

2

使用后apply,您可以使用ldplyfromplyr将其转换为 adata.frame并将各个p.value矩阵存储为合并的p.valuedata.frame,如下所示:

w <- apply(DataFrame[ , 2:4], 2, pairwise.t.test, g=DataFrame$Treatment, p.adj = "none")
require(plyr)
out <- ldply(w, function(x) x$p.value)

#   .id          A          B
# 1   A 0.29299651         NA
# 2   A 0.22354405 0.03227708
# 3   B 0.02434804         NA
# 4   B 0.73621775 0.04736056
# 5   C 0.92880561         NA
# 6   C 0.09587581 0.11248443

现在,您可以使用

write.table(out, "file.txt", quote=F, sep="\t", row.names=F, col.names=T)

第一列.id比较,第二列和第三列是您获得的相应 p 值矩阵。

PS:请不要使用data.frame(甚至DataFrame)作为对象的名称。有一个名为的内置函数data.frame直接与之冲突,这不是好的编程习惯。举个例子,我会改变你的功能(你不再需要)如下:

library(MASS)
Col_pairwise.t.test <- function(d) {
    for (i in 2:length(d)) {
        i_test <- pairwise.t.test(d[ ,i], d$Treatment, p.adj = "none")
        write.matrix(i_test$p.value, 
            file = paste(colnames(d[i]), "_t_test.txt", sep = ""), sep="\t")
    }
}
Col_pairwise.t.test(df)
于 2013-02-18T22:04:59.070 回答
1

您可以在应用循环中使用匿名函数,该函数从测试而不是整个测试返回 p 值。像这样...

pvals = apply(DataFrame[, 2:4], 2, function(x){
            pairwise.t.test(x=x, g=DataFrame$Treatment, p.adj = "none")$p.value
        })
于 2013-02-18T22:21:34.383 回答