【问题标题】:How can I do a t.test on an entire data.frame and extract the p-values?如何对整个 data.frame 进行 t.test 并提取 p 值?
【发布时间】:2015-01-08 00:46:05
【问题描述】:

我的数据集如下所示:

a <- rnorm(2)
b <- rnorm(2)-3
x <- rnorm(13)
y <- rnorm(2)-1
z <- rnorm(2)-2
eg <- expand.grid(a,b,x,y,z)
treatment <- c(rep(1, 2), rep(0,3))
eg <- data.frame(t(eg))
row.names(eg) <- NULL
eg <- cbind(treatment, eg)

我需要做的是在每一列上运行 t 检验,比较治疗 =1 组和治疗 =0 组。然后我想有一个 p 值向量。我已经尝试(几个版本)通过循环执行此操作,但我继续收到相同的错误消息:“选择了未定义的列”。这是我目前的代码:

p.values <- c(rep(NA, 208))

for (i in 2:209) {
  x <- data.frame(eg[eg$treatment==1][,i][1:2])
  y <- data.frame(eg[eg$treatment==0][,i][3:5])
  value <- t.test(x=x, y=y)['p.value']
  p.values[i] <- value
}

在读到有人提到 for 循环仅循环数据帧后,我添加了 data.frame(),但它并没有改变任何东西。我相信有一种更简单的方法可以做到这一点,也许是通过使用 apply 系列中的某些东西?有没有人有什么建议?非常感谢!

【问题讨论】:

    标签: r for-loop apply


    【解决方案1】:

    几个选项,都使用sapply

    sapply(
      eg[-1], function(x) t.test(x[eg$treatment==1],x[eg$treatment==0])[["p.value"]] 
    )
    

    或者循环遍历名称:

    sapply(
      names(eg[-1]), 
      function(x) t.test(as.formula(paste(x,"~ treatment")),data=eg)[["p.value"]] 
    )
    

    甚至mapply:

    mapply(function(x,y) t.test(x ~ y,data=cbind(x,y))[["p.value"]], eg[-1], eg[1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2015-02-06
      • 2020-05-27
      • 1970-01-01
      • 2013-10-04
      • 2015-10-14
      • 1970-01-01
      相关资源
      最近更新 更多