在R

时间:2017-03-07 01:37:37

标签: r for-loop dataframe subset sliding-window

大图解释是我正在尝试对R中的环境数据进行滑动窗口分析。我有两个连续日期的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

我想创建一个循环(或任何其他可能的方式),将数据框(两列!)子集化为两周的窗口(14行),从开始到结束,从一个窗口滑动到下一个窗口一周( 7行)。因此,第一个窗口将包括行1到14,第二个窗口将包括行8到21等等。在子集化之后,需要在结构中翻转数据(当前使用reshape2包中的融合函数),以便PAR数据的值在一列中,而par14或par15的变量在另一列中。然后我需要摆脱NaN数据,最后在每个窗口上执行wilcox秩和检验,将PAR与变量年份(par14或par15)进行比较。下面是我编写的代码,用于证明我想要的概念,对于第一个子集化窗口,它给出了我想要的内容。

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来说相当新,并且没有丰富的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
  }
}

如果有人有更好的方法通过我不知道的不同的包或功能来做到这一点,我会喜欢开悟。我确实尝试过滚动应用但遇到问题,找到了将其应用于整个数据框而不仅仅是一列的方法。我已经从关于子集,for循环和滚动分析的许多其他问题中寻求帮助,但似乎找不到我需要的东西。任何帮助都会受到沮丧的研究生的欢迎:)如果我没有提供足够的信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

考虑lapply使用一年中365天的每7个值的序列(不包括最后一天以避免最后一次分组中的单日),所有这些都返回Wilcox测试p值的数据帧列表< em>周指标。然后,行将每个列表项绑定到最终的单个数据帧:

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)