2017-03-07 322 views
2

大圖解釋是我想對R中的環境數據做一個滑動窗口分析。我有選擇數目的連續日期的PAR(光合有效輻射)數據 - 根據其他生物因素確定)爲兩年(2014年和2015年),每天的PAR值爲1。請參閱下面的數據框的幾行第一行(數據框名稱爲「rollingpar」)。R中的for循環中的數據幀的滾動子集

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 

我想創建一個循環(或任何其他可能的方式),以子集的數據幀(兩列!)爲從開始2周窗口(14行)來完成滑動從一個窗口到下一個到一週(7行)。因此,第一個窗口將包含1到14行,第二個窗口將包含8到21行等等。子集化後,數據需要在結構中翻轉(目前使用reshape2包中的熔化函數),以便PAR數據的值位於一列中,而par14或par15的變量位於另一列中。然後,我需要擺脫NaN數據,最後在每個窗口上進行wilcox秩和檢驗,比較可變年份(par14或par15)的PAR。下面是我寫的代碼來證明我想要的概念,第一個子集窗口給了我想要的東西。

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 

當我試圖寫一個for循環通過整個數據幀迭代過程(總行數= 139)我有錯誤每哪種方式我跑它。另外,這個循環甚至沒有考慮到一週的滑動情況。我想如果我能弄清楚如何讓窗口先通過循環運行分析,然後我可以嘗試通過滑動部分進行分析。基本上我意識到,我解釋我想要的和我爲循環寫的東西稍有不同。下面的代碼是逐行或以一天爲基礎滑動。如果解決方案包含一週的下滑,我將不勝感激。我對R相當陌生,對循環沒有豐富的經驗,所以我覺得可能有一個簡單的修復方法來完成這個工作。

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 
    } 
} 

如果任何人有一個更好的方式,通過不同的包或功能,我不知道我會喜歡被悟到做到這一點。我確實嘗試了滾動應用,但遇到了將問題應用到整個數據框而不是一列的問題。我已經從關於子集,循環和滾動分析的許多其他問題中尋求幫助,但似乎無法完全找到我需要的東西。任何幫助將感激沮喪的研究生:)如果我沒有提供足夠的信息,請讓我知道。

回答

0

考慮一個lapply使用通過一年365天,每7個值的序列(最後一天,不包括以避免單日最後的分組),所有返回威爾科克斯檢驗的p值的數據幀列表與指標。然後再將每個列表項綁定到最終的單個數據框中:

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

謝謝!這正是我所需要的。我只需要調整slidingWindow來反映我的數據集中的行數,然後在熔化步驟中添加一個id.vars,但它的工作完美! –

+0

好聽!很高興我能幫上忙! – Parfait