R中for循环内数据帧的滚动子集

Rolling subset of data frame within for loop in R

大图解释是我正在尝试对 R 中的环境数据进行滑动 window 分析。我有 select 个连续日期的 PAR(光合有效辐射)数据(预- 根据其他生物因素确定)两年(2014 年和 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

我想创建一个循环(或任何其他可能的方式)将数据框(两列!)子集化为两周 windows(14 行)从开始到结束从一个 window 到下一个星期(7 行)。因此,第一个 window 将包括第 1 到 14 行,第二个 window 将包括第 8 到 21 行,依此类推。子集化后,需要对数据进行结构翻转(目前使用reshape2包中的melt函数),使PAR数据的值在一列,par14或par15的变量在另一列。然后我需要去掉 NaN 数据,最后对每个 window 执行 wilcox 运行k 总和测试,比较变量年份(par14 或 par15)的 PAR。下面是我为证明我想要的概念而编写的代码,对于第一个子集window,它正是我想要的。

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)中迭代该过程时,我 运行 以任何方式都遇到了错误。此外,这个循环甚至没有考虑一周的滑动。我想如果我能先弄清楚如何通过循环获取 windows 和 运行 分析,然后我就可以尝试解析滑动部分。基本上我意识到我解释的我想要的和我写的这个 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 但 运行 遇到了问题,无法找到将其应用于整个数据框而不仅仅是一列的方法。我已经从有关子集化、for 循环和滚动分析的许多其他问题中寻求帮助,但似乎无法完全找到我需要的东西。对于沮丧的研究生,我们将不胜感激 :) 如果我没有提供足够的信息,请告诉我。

考虑 lapply 在一年中的 365 天中使用每 7 个值的序列(最后一天不包括在内,以避免在最后一个分组中只有一天),全部到 return Wilcox 的数据框列表使用 Week 指标测试 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)