如何编写通用函数来选择正值之间的距离?

时间:2010-09-13 18:51:47

标签: r

我有一个看起来像这样的数据集:

            x             y
1       0.0000  0.4459183993
2     125.1128  0.4068805502
3     250.2257  0.3678521348
4     375.3385  0.3294434397
5     500.4513  0.2922601919
6     625.5642  0.2566381551
7     750.6770  0.2229130927
8     875.7898  0.1914207684
9    1000.9026  0.1624969456
10   1126.0155  0.1364773879
11   1251.1283  0.1136978589
12   1376.2411  0.0944717371
13   1501.3540  0.0786550515
14   1626.4668  0.0656763159
15   1751.5796  0.0549476349
16   1876.6925  0.0458811131
17   2001.8053  0.0378895151
18   2126.9181  0.0304416321
19   2252.0309  0.0231041362
20   2377.1438  0.0154535572
21   2502.2566  0.0070928195
22   2627.3694 -0.0020708606
23   2752.4823 -0.0119351534
24   2877.5951 -0.0223944877
25   3002.7079 -0.0332811155
26   3127.8208 -0.0442410358
27   3252.9336 -0.0548855203
...

完整数据here

通过使用零截距线绘制x和y,可以更直观地看到:

ggplot(dat,aes(x,y)) + geom_line() + geom_hline(yintercept=0)

你可以看到情节here(如果你不想下载数据并自己绘制。)

我想挑出'补丁',定义为从y线上的线越过零直到它低于零时沿x的距离。这将始终至少发生一次(因为线从零开始),但可能会多次发生。

挑出第一个补丁很容易。

patch1=dat[min(which(dat$y<=0.000001)),]

但是我如何循环并获取后续补丁呢?

1 个答案:

答案 0 :(得分:3)

这是一个完整的解决方案:

# sample data
df <- data.frame(x=1:10, y=rnorm(10))
# find positive changes in "y"
idx <- which(c(FALSE, diff(df$y > 0) == 1))
# get the change in "x"
patches <- diff(c(0, df[idx, "x"]))