大图解释是我正在尝试对 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 rank sum test 比较变量年份(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 循环和滚动分析的问题中寻求帮助,但似乎无法完全找到我需要的东西。对于沮丧的研究生,我们将不胜感激 :) 如果我没有提供足够的信息,请告诉我。
考虑lapply
在一年中的 365 天中使用每 7 个值的序列(不包括最后一天以避免最后分组中的一天),所有这些都返回带有周指示器的 Wilcox 测试 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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句