2017-03-07 4 views
2

Big Picture Erklärung ist ich versuche, eine gleitende Fensteranalyse auf Umweltdaten in R zu tun. Ich habe PAR (photosynthetisch aktive Strahlung) Daten für eine ausgewählte Anzahl von sequentiellen Daten (pre - basierend auf anderen biologischen Faktoren bestimmt) für zwei Jahre (2014 und 2015) mit einem Wert von PAR pro Tag. Siehe unten die ersten Zeilen des Datenrahmens (Name des Datenrahmens ist "rollingpar").Rolling Subset von Datenrahmen in for Schleife in R

par14   par15 
1356.3242  1306.7725 
NaN    1232.5637 
1349.3519  505.4832 
NaN    1350.4282 
1344.9306  1344.6508 
NaN    1277.9051 
989.5620  NaN 

Ich mag eine Schleife (oder irgendeine andere Art und Weise möglich) erstellen, den Datenrahmen (beid Spalten!) In 2 Wochen Fenster (14 Zeilen) von Anfang der Teilmenge von einem Fenster zum nächsten zu beenden Schiebe nach einer Woche (7 Zeilen). So würde das erste Fenster die Zeilen 1 bis 14 und das zweite Fenster die Zeilen 8 bis 21 usw. enthalten. Nach dem Subsetting müssen die Daten in der Struktur gewendet werden (derzeit mit der Funktion melt im Paket reshape2), so dass die Werte der PAR-Daten in einer Spalte und die Variable par14 oder par15 in der anderen Spalte sind. Dann muss ich die NaN-Daten loswerden und schließlich einen Wilcox-Rangsummentest für jedes Fenster durchführen, wobei PAR mit dem variablen Jahr verglichen wird (Par14 oder Par15). Unten ist der Code, den ich geschrieben habe, um das Konzept zu beweisen, was ich wollte und für das erste Teilfenster gibt es mir genau das, was ich will.

library(reshape2) 
par.sub=rollingpar[1:14, ] 
par.sub=melt(par.sub) 
par.sub=na.omit(par.sub) 
par.sub$variable=as.factor(par.sub$variable) 
wilcox.test(value~variable, par.sub) 
#when melt flips a data frame the columns become value and variable... 
#for this case value holds the PAR data and variable holds the year 
#information 

Als ich versuchte, ein for-Schleife zu schreiben, um den Prozess durch den gesamten Datenrahmen (total rows = 139) I bekam jeden Fehler iterieren, die, wie ich es lief. Außerdem berücksichtigt diese Schleife nicht einmal das Verschieben um eine Woche. Ich dachte mir, wenn ich nur herausfinden könnte, wie man Fenster bekommt und die Analyse zuerst über eine Schleife ausführt, dann könnte ich versuchen, durch den gleitenden Teil zu suchen. Im Grunde erkenne ich, dass das, was ich erklärte, was ich wollte und was ich für diese Schleife geschrieben habe, etwas anders ist. Der folgende Code wird Zeile für Zeile oder Tag für Tag verschoben. Ich würde es sehr schätzen, wenn die Lösung den Aspekt der Verschiebung um eine Woche umfasste. Ich bin ziemlich neu in R und habe keine umfangreiche Erfahrung mit for-Schleifen, also habe ich das Gefühl, dass es wahrscheinlich eine einfache Lösung gibt, um das funktionieren zu lassen.

wilcoxvalues=data.frame(p.values=numeric(0)) 
Upar=rollingpar$par14 
for (i in 1:length(Upar)){ 
    par.sub=rollingpar[[i]:[i]+13, ] 
    par.sub=melt(par.sub) 
    par.sub=na.omit(par.sub) 
    par.sub$variable=as.factor(par.sub$variable) 
    save.sub=wilcox.test(value~variable, par.sub) 
    for (j in 1:length(save.sub)){ 
    wilcoxvalues$p.value[j]=save.sub$p.value 
    } 
} 

Wenn jemand eine viel bessere Art und Weise hat dies durch ein anderes Paket oder eine Funktion zu tun, die ich nicht bewusst, ich bin lieben würde, erleuchtet werden. Ich habe versucht, wraw apply, aber lief auf Probleme mit der Suche nach einer Möglichkeit, um es auf einen gesamten Datenrahmen und nicht nur eine Spalte anwenden. Ich habe nach Unterstützung aus den vielen anderen Fragen in Bezug auf Subsetting, For-Loops und Rolling-Analyse gesucht, kann aber nicht genau das finden, was ich brauche. Jede Hilfe wäre einem frustrierten Studenten dankbar :) und wenn ich nicht genügend Informationen zur Verfügung gestellt habe, lass es mich wissen.

Antwort

0

Betrachten wir ein lapply unter Verwendung einer Folge von jeweils 7 Werte über 365 Tage im Jahr (letzter Tag nicht enthalten Tag in letzte Gruppierung zu vermeiden), die alle eine Datenrahmen Liste der Wilcox-Test p-Werte mit Woche zurückzukehren Anzeige . Spätere Reihen binden jedes Listenelement in den endgültigen, einzelnen Datenrahmen:

library(reshape2) 
slidingWindow <- seq(1,364,by=7) 
slidingWindow 
# [1] 1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 113 120 127 
# [20] 134 141 148 155 162 169 176 183 190 197 204 211 218 225 232 239 246 253 260 
# [39] 267 274 281 288 295 302 309 316 323 330 337 344 351 358 

# LIST OF WILCOX P VALUES DFs FOR EACH SLIDING WINDOW (TWO-WEEK PERIODS) 
wilcoxvalues <- lapply(slidingWindow, function(i) { 
    par.sub=rollingpar[i:(i+13), ] 
    par.sub=melt(par.sub) 
    par.sub=na.omit(par.sub) 
    par.sub$variable=as.factor(par.sub$variable) 
    data.frame(week=paste0("Week: ", i%/%7+1, "-", i%/%7+2), 
       p.values=wilcox.test(value~variable, par.sub)$p.value) 
}) 

# SINGLE DF OF ALL P-VALUES 
wilcoxdf <- do.call(rbind, wilcoxvalues) 
+0

Vielen Dank !!! Das war genau das, was ich brauchte. Ich musste nur das slidingWindow anpassen, um die Anzahl der Zeilen in meinem Datensatz widerzuspiegeln und ein id.vars während des Schmelzschritts hinzuzufügen, aber dann funktionierte es perfekt! –

+0

Gut zu hören! Froh, dass ich helfen konnte! – Parfait