2013-07-30 63 views
0

我有一個data.frame我試圖測試(與WilcoxRankSum測試)第1和第2行,然後第3和第4行等。所以我寫了一個循環。因爲我必須將其應用於多個數據框架,所以我創建了一個函數來存儲此循環並稍後將其應用於其他人。 我嘗試多次重置括號{}或用其他幾個線程推薦的sapply替換pval[i]無法存儲循環的結果

在我看來,循環工作正常。但循環無法訪問pval。很抱歉打擾你一個共同的問題。我是一個新自學的(全部來自線程;))。但我找不到問題。如果你看到捷徑讓生活更輕鬆, 我真的很樂意看到任何評論。

這裏是我的代碼:

ZP <- function(data){ 
library(exactRankTests) 
pval <- vector(length=nrow(data)) 
k <- seq(1,nrow(data)-1, by=2) 
for (i in seq_along(k)) { 
pval[i] <- wilcox.exact(as.numeric(data[k[i],6:10]), 
          as.numeric(data[k[i]+1,6:10]), 
          alternative = "greater", conf.level=0.95)$p.value 
return(pval) 
} 
} 

下面是結果:

ZP(realdata) 
[1] 0.8492063 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
[9] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
[17] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
[25] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 

我希望它看起來像這個,所以我可以在以後它cbind的數據:

ZP(realdata) 
[1] "pval" "0" "pval" "0" "pval" "0" "pval" "0" "pval" "0" "pval" 
[12] "0" "pval" "0" "pval" "0" "pval" "0" "pval" "0" "pval" "0" 
[23] "pval" "0" "pval" "0" "pval" "0" "pval" "0" "pval" "0" 

我的數據像這樣:

 Proband Lauf Interleukin Ansatz Zeitpunkt Data1 Data2 Data3 Data4 Data5 
1  1 1  IFNy stim  ZP0   7  2  3  3  7 
2  1 1  IFNy neg  ZP0   3  2  0  2  1 
+2

你的函數似乎沒有返回任何東西:你可能希望它的最後一行是'pval'或'return(pval)'。 –

+0

另外,你的大括號不合適,因爲你正存儲在'for''循環之外的'pval [[i]]中。 – Thomas

+0

我想要結果以長度= nrow(數據)的向量返回,所以我可以稍後將其綁定到數據。 – newbymedicalstats

回答

1

所以我終於得到了我的循環工作。一旦我運行該函數並將其應用於一組數據,它將返回我的值。但是,當R顯示我pval,我之前設置爲'0',它仍然是0.我似乎無法訪問函數外的pval。它可能是我缺少的基本東西。

P <- function(x){ 
    library(exactRankTests) 
    pval <- vector(length=nrow(x)) 
    k <- seq(1, nrow(x), by=2) 
    for (i in seq_along(k)) { 
    pval[k[i]] <- wilcox.exact(as.numeric(x[k[i],6:10]), 
           as.numeric(x[k[i]+1,6:10]), 
           alternative = "greater", conf.level=0.95)$p.value} 
    return(pval) 
} 
+0

當函數返回某個東西時,如果要使用它,則需要指定它。如果你希望它被稱爲'pval',那麼指定它! 'pval < - P(yourdata)'。在函數內部調用它並不重要,它在調用函數時分配給它的名稱很重要。 – Gregor

+0

嗨,謝謝,我知道這是基本的。但是,我如何將存儲自動化爲pval? – newbymedicalstats

+0

我很難理解你的問題。爲了使事情自動化,將它們放在一個R腳本和'source()'腳本中以運行其中的所有命令,其中可以包括像我上面評論中那樣的任務。一般而言,具有修改或創建新變量的函數本身就是面向對象編程的範例。在這個領域裏,R是一種函數式編程語言,運行一個函數不應該有「副作用」,也就是說,它不應該只是在你的工作空間中創建一個新的變量。 – Gregor

0

這裏有一個小更少的代碼的策略:

library(exactRankTests) 
# sample data 
realdata <- data.frame(matrix(rnorm(1000),nrow=40)) 

# odd row indices 
x <- seq(1,nrow(realdata)-1,by=2) 

pvals <- vector(length=length(x)) # empty vector 
for(i in seq_along(x)) 
    pvals[i] <- wilcox.exact(as.numeric(realdata[x[i],]), 
          as.numeric(realdata[x[i]+1,]), 
          alternative="greater", 
          conf.level=0.95)$p.value 
+0

nrow(奇數)是什麼意思?你的意思是nrow(x)。這會返回NULL。 – newbymedicalstats

+0

@newbymedicalstats對不起,更改了代碼。 – Thomas

+0

我相應地改變了它,仍然不起作用。將更新上面更改的代碼。 Thx – newbymedicalstats

0

這個怎麼樣企圖(這可能潛在地wilcox.exact()標準地工作)?

# data <- iris[rep(1:50,each=2)+c(0,50),] # use some flowers for demonstration 
p.vals <- as.numeric(by(data[,1:4],rep(seq(50),each=2), function(rowpair) 
    wilcox.test(rowpair[,1], rowpair[,2], alt="greater")$p.val)) 

順便說一句:如果你只對p.val感興趣,指定conf.level=0.95似乎可有可無。

+0

你是不是指'funtion(colpair)'? – newbymedicalstats

+0

@newbymedicalstats:這個想法不是將明確的迭代與一個'{}'命令塊組合起來,而是調用一些函數來處理某些函數的參數(和by()()同時使用某些數據結構的元素需要另一個變量來定義子組,請參閱'?by')。 – texb