Dir*_*ats 2 r time-series threshold
我有随时间变化的通量数据,并希望获得通量从负变为正或反之的时间列表.这看起来很简单,所以它可能有一个简单的答案,但我找不到我的搜索条件.
样本数据:
day=c(1,2,3,5,10,20)
flux=c(-2,-4,1,-2,4,11)
Run Code Online (Sandbox Code Playgroud)
我想得到一个类似矢量crossover_times =(2.5,4,7.5)的东西来表示变化发生的插值天数,理想情况下,还有表明符号变化走向的信息,例如sign_changes =(正,负,正).
当然,我可以编写一个循环来迭代数据,但我猜测R有一个或多个有用的功能.有什么建议?
G. *_*eck 12
diff(sign(flux)) 在交叉处将是非零并且将具有交叉的标志:
updn <- c(0, diff(sign(flux)))
ix <- which(updn != 0)
(day[ix] + day[ix-1])/2
## [1] 2.5 4.0 7.5
sign(updn)[ix]
## [1] 1 -1 1
Run Code Online (Sandbox Code Playgroud)
更新:增加了穿越的迹象.改进.
您可以使用nifty rle函数来计算交叉点和方向的位置向量。rle计算相同向量的游程长度和值,并且我们已将值是否为负的二进制向量传递给了它。
pos <- head(cumsum(rle(flux >= 0)$lengths), -1)
pos
# [1] 2 3 4
Run Code Online (Sandbox Code Playgroud)
所有的残差都是插值并得到方向:
(day[pos] + day[pos+1]) / 2
# [1] 2.5 4.0 7.5
c("positive", "negative")[head(rle(flux >= 0)$values + 1, -1)]
# [1] "positive" "negative" "positive"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3893 次 |
| 最近记录: |