2015-12-17 63 views
0

我對編程很陌生,對如何解決這個問題不知道如何解決,所以不勝感激。在R中應用t.test數據框

我必須使用雙樣本t-檢驗來比較兩組數據,ct,其中的每一個在相同的數據幀被分成6個子列,在Excel中數據出現這樣的事:

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

"name"對於每一行都是相同的,但行之間不同。 列c1-t6包含數值,每行和每列之間不同。

每行必須單獨測試,將c小組與t小組進行比較。

我該怎麼做呢?我猜測需要一個循環?

+2

使用'Map'來匹配治療和控制列,如:http://stackoverflow.com/questions/26269163/mapply -complete-for-columnwise-t-test-of-two-dataframes -r/26269215 – thelatemail

+0

Thankyou,這非常有幫助。然而,使用這些代碼,我得到了整個列的整體結果,即c1,c2等的t統計量,但我需要每列和行的結果,即名稱1 c1,名稱1 c2等的結果,然後名稱2 c1,名稱2 c2​​等等,用於大約22,000個名稱的數據集。也許所描述的功能是這樣工作的,而且我錯誤地實現了它們? – user5688971

回答

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)])) 
} 
+0

除非您指定var.equal = T,否則您正在執行welch測試而不是經典的兩個示例t.test()... – OFish

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)) 

但是,我不entirley肯定這是你想做的事,因爲這似乎循環功能在列而不是行。因此,有點哈克溶液(請別人告訴我一個更簡單的方法),我會做到以下幾點:

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你想要的數據。