我是编程新手,并且不知道如何处理这个问题,我们非常感谢任何帮助。
我必须使用双样本t检验来比较两组数据c
和t
,每组数据在同一数据帧中分为6个子列,在Excel中数据看起来是这样的:
name|c1|c2|c3|c4|c5|c6|t1|t2|t3|t4|t5|t6
每行的 "name"
相同,但行之间不同。
列c1-t6包含数值,每个行和列之间不同。
必须单独测试每一行,将c
子组与t
子组进行比较。
我该怎么做呢?我猜需要一个循环?
答案 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)]))
}