2017-04-09 40 views
0

我有一些數據並試圖做分析。我不知道如何使用R,但我在互聯網上觀看了一些視頻,試圖模仿我需要的相同測試。我想要做的是試圖比較前四(1-4)行與接下來的四(4-8)行。獲得結果後,我想將相同的測試應用到下一列,因此我將擁有4個不同的p值。請查看附件attached image的示例圖片。我總共有4個色譜柱,這是先導試驗,稍後將用大色譜柱進行。請問是否有人能告訴我我做錯了什麼,並編輯代碼。我會很高興爲所有幫助。錯誤:每列的R循環?

Test = matrix(c(120, 115, 132, 117, 116,117,125,120,110,113,128,115),ncol=4, nrow = 4) 
Test=t(Test) 

Drug = matrix(c(88, 80, 85, 85, 83,84,90,83,83,79,86,82),ncol=4, nrow = 4) 
Drug=t(Drug) 
mydata<-cbind(Test,Drug) 


for (i in 1:4) 
wilcox.test(mydata[i,1:4],mydata[i,5:8], mu=0, alt="two.sided", paired=T, conf.int=F,conf.level = 0.99, exact=T,correct=T) 
+0

我跑你的代碼,它的工作原理。你確實收到關於關係的警告信息。這是你的問題嗎? – KoenV

+0

@KoenV,不,問題是循環不起作用。它發出警告並且不計算任何東西。如果我刪除for循環,並將「我」更改爲1或2或3 ...它的工作原理,但我想做一個循環,而不是寫數字到列的地方。 –

+0

@KoenV我想要做的就是使用「我」作爲循環,因此它可以給出4個不同的p值。爲了清楚說明它們之間的比較:** mydata [1,1:4] -mydata [1,5:8] **,** mydata [2,1:4] -mydata [2,5 :8] **,** mydata [3,1:4] -mydata [3,5:8] **,** mydata [4,1:4] -mydata [4,5:8] **。所以我不想每次都改變列號,但是我想使用循環或者自動進入下一列並重新計算的東西。 –

回答

1

我建議使用一個data.framedata.table此與列指定基團(對應於行中的示例,例如A,B,C),一個列指定試驗/藥物並用值的一個柱:

library(data.table) 
Test <- c(120, 115, 132, 117, 116,117,125,120,110,113,128,115) 
Drug <- c(88, 80, 85, 85, 83,84,90,83,83,79,86,82) 
groups <- rep(c(rep("A", 4), rep("B", 4), rep("C", 4)), 2) 
variable <- c(rep("test", length(Test)), rep("drug", length(Drug))) 
dt <- data.table(group = groups, variable = variable, value = c(Test, Drug)) 

# >dt 
#  group variable value 
# 1:  A  test 120 
# 2:  A  test 115 
# 3:  A  test 132 
# 4:  A  test 117 
# 5:  B  test 116 
# 6:  B  test 117 
# 7:  B  test 125 
# 8:  B  test 120 
# 9:  C  test 110 
# 10:  C  test 113 
# 11:  C  test 128 
# 12:  C  test 115 
# 13:  A  drug 88 
# 14:  A  drug 80 
# 15:  A  drug 85 
# 16:  A  drug 85 
# 17:  B  drug 83 
# 18:  B  drug 84 
# 19:  B  drug 90 
# 20:  B  drug 83 
# 21:  C  drug 83 
# 22:  C  drug 79 
# 23:  C  drug 86 
# 24:  C  drug 82 
#  group variable value 

測試的測試值VS每組藥物值是那麼的事:

dt_stat <- dt[, .(p_value = wilcox.test(value~variable, mu=0, alt="two.sided", paired = TRUE, 
    conf.int = FALSE, conf.level = 0.99,exact = TRUE, correct = TRUE)$p.value), 
    by = .(group)] 

# > dt_stat 
# group p_value 
# 1:  A 0.09751254 
# 2:  B 0.09751254 
# 3:  C 0.12500000 
+0

你先生,救了我的一天。非常感謝你。我想問另一個問題。如果我有這樣的兩組100列,我應該寫20個不同的字母嗎?對於3個不同的列,你寫了A,B,C,但是對於大量的列號,有沒有簡短的方法呢? +1 +1 +1 +1 –

+0

不客氣。您可以使用數字(例如1到100)而不是A,B,C。 –

+0

有沒有辦法在循環中執行它,先生?我的意思是即使這樣,我也可以使用它,但如果有一個捷徑,而不是寫1到100,我會更高興。再次感謝您的大力幫助。 –