Как мне написать универсальную функцию для определения расстояния между положительными значениями? - PullRequest
2 голосов
/ 13 сентября 2010

У меня есть набор данных, который выглядит так:

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

Доступны полные данные здесь .

Это проще увидеть визуально, нанося x и y с нулевой линией перехвата:

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

Вы можете увидеть график здесь (если вы не хотитечтобы загрузить данные и построить их самостоятельно.)

Я хочу выделить «заплатки», определяемые как расстояние вдоль x от момента, когда линия поднимается выше нуля на y, до тех пор, пока она не опустится ниже нуля.Это всегда будет происходить хотя бы один раз (поскольку линия начинается выше нуля), но может происходить много раз.

Выбрать первый патч легко.

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

Но как мне пройти через цикл и выбрать последующие патчи?

1 Ответ

3 голосов
/ 13 сентября 2010

Вот полное рабочее решение:

# 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"]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...