【发布时间】:2017-07-27 02:13:19
【问题描述】:
大图解释是我正在尝试对 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包中的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
}
}
如果有人有更好的方法通过我不知道的不同的包或功能来做到这一点,我很想得到启发。我确实尝试过滚动应用,但在找到一种将其应用于整个数据框而不仅仅是一列的方法时遇到了问题。我已经从有关子集、for 循环和滚动分析的许多其他问题中寻求帮助,但似乎无法完全找到我需要的东西。如果我没有提供足够的信息,请告诉我。
【问题讨论】:
标签: r for-loop dataframe subset sliding-window