在R中的数据框中跨多个变量自动执行t检验和卡方检验

时间:2018-12-15 19:44:21

标签: r summary chi-squared

以下是一些示例数据:

set.seed(1234)    # Make the results reproducible

count <- 100
cs1 <- round(rchisq(count, 1), 2)
cs2 <- round(rchisq(count, 2), 2)
c(rep("Present", 30), rep("Absent", 30), rep("NA", 40)) -> temp
temp[temp == "NA"] <- NA
as.factor(temp) -> temp
temp1 <- round(rnorm(count, 3), 2)
temp1[7] <- NA
temp2 <- round(rnorm(count, 7), 2)
temp2[54] <- NA
c(rep("Yes", 30), rep("No", 30), rep("Maybe", 30), rep("NA", 10)) -> temp3
temp3[temp3 == "NA"] <- NA
as.factor(temp3) -> temp3
c(rep("Group A", 55), rep("Group B", 45)) -> temp4
as.factor(temp4) -> temp4
mydata <- data.frame(cs1, cs2, temp, temp1, temp2, temp3, temp4)
mydata$cs2[56:100] <- NA ; mydata

我知道我可以为temp4分层的每个变量计算摘要统计信息,如下所示:

by(mydata, mydata$temp4, summary)

但是,我还想为temp4分层的每个变量计算t.test或chisq.test。我试图简单地修改上面的代码来做到这一点,但它总是给我一个错误。似乎错误是由于以下事实造成的:数据帧中的某些变量是数字变量(因此,需要进行t.test检验),而其他变量是因子(因此,需要进行chisq.test检验)。

是否有一种简单的方法可以让R一次检查所有变量以查看其类型,然后运行适当的测试?并且即使遇到错误仍要打印出所有结果?

我并不担心这样做的适当性(例如,我知道进行多次测试的风险等),而只是需要知道如何做。谢谢!

2 个答案:

答案 0 :(得分:1)

是的,您可以遍历指定的列,将temp4用作因子,并检查每列的类(在匿名函数中命名为x)。您可以使用sapplyapply(X, MARGIN = 2, FUN ...)。请注意,我明确地将mydata设置为子集,因为我发现它更加明确和可读。

sapply(mydata[, c("cs1", "cs2", "temp", "temp1", "temp2", "temp3")], FUN = function(x, group) {
  if (class(x) == "numeric") {
    # perform t-test, e.g. t.test(x ~ group)
    return(result_of_t_test)
  }

  if (class(x) == "factor") {
    # perform chi-square test
    return(result_of_chisq_test)
  }
}, group = mydata$temp4)

答案 1 :(得分:1)

您可以使用lapply遍历变量,并在匿名函数内部决定要执行的测试。
发生错误时,它会被tryCatch捕获,最终列表将以错误消息作为成员,而不是测试结果。

tests_list <- lapply(mydata[-ncol(mydata)], function(x){
  tryCatch({
    if(is.numeric(x)){
      if(length(levels(mydata$temp4)) == 2){
        t.test(x ~ temp4, data = mydata)
      }else{
        aov(x ~ temp4, data = mydata)
      }
    }else{
      tbl <- table(x, mydata$temp4)
      chisq.test(tbl)
    }
  }, error = function(e) e)
})

err <- sapply(tests_list, inherits, "error")

tests_list$cs1
tests_list$temp3

tests_list[[err]]