2017-03-07 118 views
2

大图解释是我想对R中的环境数据做一个滑动窗口分析。我有选择数目的连续日期的PAR(光合有效辐射)数据 - 根据其他生物因素确定)为两年(2014年和2015年),每天的PAR值为1。请参阅下面的数据框的几行第一行(数据框名称为“rollingpar”)。R中的for循环中的数据帧的滚动子集

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 

我想创建一个循环(或任何其他可能的方式),以子集的数据帧(两列!)为从开始2周窗口(14行)来完成滑动从一个窗口到下一个到一周(7行)。因此,第一个窗口将包含1到14行,第二个窗口将包含8到21行等等。子集化后,数据需要在结构中翻转(目前使用reshape2包中的熔化函数),以便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)我有错误每哪种方式我跑它。另外,这个循环甚至没有考虑到一周的滑动情况。我想如果我能弄清楚如何让窗口先通过循环运行分析,然后我可以尝试通过滑动部分进行分析。基本上我意识到,我解释我想要的和我为循环写的东西稍有不同。下面的代码是逐行或以一天为基础滑动。如果解决方案包含一周的下滑,我将不胜感激。我对R相当陌生,对循环没有丰富的经验,所以我觉得可能有一个简单的修复方法来完成这个工作。

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

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

回答

0

考虑一个lapply使用通过一年365天,每7个值的序列(最后一天,不包括以避免单日最后的分组),所有返回威尔科克斯检验的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) 
+0

谢谢!这正是我所需要的。我只需要调整slidingWindow来反映我的数据集中的行数,然后在熔化步骤中添加一个id.vars,但它的工作完美! –

+0

好听!很高兴我能帮上忙! – Parfait