2013-07-30 7 views
0

У меня есть data.frame, который я пытаюсь проверить (с помощью WilcoxRankSum-Test) 1-й и 2-й строки, затем 3-й и 4-й строки и так далее. Поэтому я написал цикл. Поскольку я должен применить это к нескольким кадрам данных, я создал функцию для хранения этого цикла и позже применил его к другим. Я попытался сбросить скобки {} несколько раз или заменить pval[i] на sapply, как рекомендовано в нескольких других потоках.Не удалось сохранить результаты цикла

По-моему, петли прекрасно работают. Но цикл не может получить доступ к 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

Кроме того, ваши фигурные скобки неуместны, потому что вы храните их в 'pval [[i]]' вне вашего 'for'-loop. – Thomas

+0

Я хочу, чтобы результаты возвращались в вектор length = nrow (data), поэтому я могу привязать его позже к данным. – 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 (odd)? Вы имели в виду 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)) 

Btw: В случае, если вы заинтересованы только в p.val, указав conf.level=0.95 кажется необязательной.

+0

Вы имели в виду 'funtion (colpair) '? – newbymedicalstats

+0

@newbymedicalstats: вместо объединения явной итерации с блоком команд '{}' идея состоит в том, чтобы вызвать некоторую функцию, которая заботится об использовании элементов некоторой структуры данных в качестве параметров для некоторой функции (и 'by()' одновременно принимает другую переменную для определения подгрупп, см. '? by'). – texb

Смежные вопросы