在R中应用t.test数据帧

时间:2015-12-17 01:27:40

标签: r loops dataframe

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

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

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

"name"相同,但行之间不同。 列c1-t6包含数值,每个行和列之间不同。

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

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

2 个答案:

答案 0 :(得分:1)

使用@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

答案 1 :(得分: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)]))
}