无法存储循环结果

时间:2013-07-30 12:26:26

标签: r function loops storage

我有一个data.frame,我尝试测试(使用WilcoxRankSum-Test)第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

我希望它看起来像这样,所以我可以稍后将其与数据联系起来:

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

3 个答案:

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

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

答案 2 :(得分: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似乎是可有可无的。