我有随时间变化的通量数据,并希望获得通量从负变为正或反之的时间列表。这看起来很简单,所以它可能有一个简单的答案,但我找不到我的搜索条件。
示例数据:
day=c(1,2,3,5,10,20)
flux=c(-2,-4,1,-2,4,11)
我希望获得类似矢量crossover_times =(2.5,4,7.5)的内容,以指示更改发生的内插天数,并且理想情况下,还指示标志更改的方式的信息,例如: sign_changes =(正面,负面,正面)。
当然,我可以编写一个循环来迭代数据,但我猜测R有一个或多个有用的功能。有什么建议吗?
答案 0 :(得分: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
更新:增加了穿越的迹象。改进。
答案 1 :(得分:5)
你可以使用漂亮的rle
函数来计算它穿过的位置向量和方向。 rle
计算向量相同的向量的长度和值,并且我们已经传递了值是否为非负值的二进制向量。
pos <- head(cumsum(rle(flux >= 0)$lengths), -1)
pos
# [1] 2 3 4
所有遗骸都是插值并获得方向:
(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"