【问题标题】:apply t.test dataframe in R在 R 中应用 t.test 数据框
【发布时间】:2015-12-17 01:27:40
【问题描述】:

我是编程新手,不知道如何处理这个问题,非常感谢任何帮助。

我必须使用双样本t检验来比较两组数据,ct,每个数据在同一个数据框中分为6个子列,在Excel中数据看起来像这样:

name|c1|c2|c3|c4|c5|c6|t1|t2|t3|t4|t5|t6

"name" 对于每一行都是相同的,但在各行之间是不同的。 c1-t6 列包含数值,每行和每列都不同。

必须单独测试每一行,将c 子组与t 子组进行比较。

我该怎么做呢?我猜需要一个循环?

【问题讨论】:

  • 使用Map来匹配处理和控制列,例如:stackoverflow.com/questions/26269163/…
  • 谢谢,这很有帮助。然而,使用这些代码,我得到了整个列的总体结果,即 c1、c2 等的 t 统计量,但我需要每列和每行的结果,即名称 1 c1、名称 1 c2 等的结果,然后名称 2 c1、名称 2 c2 等用于大约 22,000 个名称的数据集。也许所描述的功能确实以这种方式工作,而我没有正确地实现它们?

标签: r loops dataframe


【解决方案1】:

假设未配对的两个组t-test,考虑使用mapply 函数,sapply 的多元版本,它将FUN 应用于每个参数的第一个元素、第二个元素、第三个元素等等。

# DF SPLIT BETWEEN EACH CONTROL AND TREATMENT
controls <- df[c(grep("c", names(df)))]        # ALL C COLS
treatments <- df[c(grep("t", names(df)))]      # ALL T COLS

# MAPPLY USING TTEST
tstats_m <- mapply(ttest, var1=controls, var2=treatments)
tstats_m <- as.data.frame(tstats_m)

# MAPPLY USING DEFINED FUNCTION TTEST
tfunc <- function(var1, var2){
            t.test(var1, var2)            
          }
tstats_m <- mapply(tfunc, var1=controls, var2=treatments)

或者,下面是迭代每个测试结果的传统for 循环:

for (i in 1:ncol(controls){
  print(paste0("Two-sample t-test c", i, " = t", i))
  print(t.test(controls[paste0("c", i)], treatments[paste0("t", i)]))
}

【讨论】:

  • 除非您指定 var.equal=T,否则您执行的是 welch 测试而不是经典的两个样本 t.test()...
【解决方案2】:

使用@thelatemail 的输入,您很可能会执行以下操作,此处以可重现的示例进行说明。 df是你的data.frame,当我使用dplyr时,我也会在这里使用它。

require(dplyr)
df <- data.frame(
+     name = sample(letters[1:10]),
+     c1 = sample(1:10),
+     c2 = sample(1:10),
+     t1 = sample(1:10), 
+     t2 = sample(1:10))
df
   name c1 c2 t1 t2
1     i  7  3  8  2
2     h  6  4  4  8
3     g  4  6  6  5
4     b  5  1  9 10
5     a  9  5  3  7
6     j  8  9  5  3
7     d 10  8 10  4
8     c  2  2  2  1
9     e  1 10  7  6
10    f  3  7  1  9
df1 <- df %>% select(contains("c"))
df2 <- df %>% select(contains("t"))
Map(t.test, as.data.frame(df1), as.data.frame(df2))

但是,我不确定这就是您想要做的,因为这似乎使函数在列而不是行上循环。因此,一个 hacky 解决方案(请有人告诉我一个更简单的方法),我会执行以下操作:

require(tidyr)
df2 <- gather(df, condition, measurement, c1:t2)
df3 <- spread(df2, name, measurement)
df3$condition2 <- ifelse(grepl("c", df3$condition), "c", "t")
#check dimensions of new df3
for(i in 2:11){cat(colnames(df3)[i],'\n')
+                y <- df3[, i]
+                res <- t.test(y~df3$condition2, var.equal=T)
+                print(res)
+ }

注意:我已经添加了 var.equal=T 假设你想做一个two sample t.test()

我相信这会为您提供所需数据的 t.test

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多