簡體   English   中英

R中for循環內的數據幀滾動子集

[英]Rolling subset of data frame within for loop in R

大圖解釋是我正在嘗試對R中的環境數據進行滑動窗口分析。我具有連續兩年(2014年根據其他生物學因素預先確定)的選定連續日期的PAR(光合有效輻射)數據和2015年),每天的PAR值之一。 參見下面數據框的前幾行(數據框名稱為“ rollingpar”)。

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

我想創建一個循環(或任何其他可能的方式)以將數據框(兩列!)從開始到結束從一個窗口滑動到下一周(7行)分成兩個星期的窗口(14行)。 。 因此,第一個窗口將包括第1至14行,第二個窗口將包括第8至21行,依此類推。 子集化之后,需要翻轉數據的結構(當前使用reshape2包中的melt函數),以便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)的過程時,我在運行它的每種方式中均遇到錯誤。 此外,此循環甚至都沒有考慮到一周的滑動。 我想知道是否可以先弄清楚如何獲取窗口並通過循環運行分析,然后再嘗試分析滑動部分。 基本上,我意識到我想要解釋的內容與我為for循環編寫的內容略有不同。 下面的代碼逐行或一日滑動。 如果解決方案包含一周的滑動,我將不勝感激。 我對R相當陌生,並且沒有關於for循環的豐富經驗,所以我覺得可能很容易解決此問題。

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

如果有人有更好的方法可以通過我不知道的其他程序包或功能來做到這一點,那么我將很樂意為您服務。 我確實嘗試了roll apply,但是在尋找一種將其應用於整個數據框而不只是一列的方法時遇到了問題。 我已經從許多其他有關子集,循環和滾動分析的問題中尋求幫助,但似乎無法完全找到我需要的東西。 沮喪的研究生會給您任何幫助:),如果我沒有提供足夠的信息,請告訴我。

考慮一個lapply使用每7個值序列通過一年365天(最后一天,不包括以避免單日最后一組),所有返回威爾科克斯檢驗的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM