Как посчитать число последовательных событий ниже порога в R - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть следующие данные:

> dput(s1[1:10,])

structure(list(V1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), V2 = c(0, 
0.55, 0.9, 3.125, 5, 19.96666667, 12.25, 35.15, 5.4, 58.58)), 
na.action = structure(260:270, .Names = c("260", 
"261", "262", "263", "264", "265", "266", "267", "268", "269", 
"270"), class = "omit"), row.names = c("33", "317", "6", 
"202","250", "185", "28", "251", "218", "116"), class = 
"data.frame")

Я хотел бы подсчитать количество последовательных вхождений, когда V2 (второй столбец) ниже 1, по крайней мере, для 3 последовательных временных шагов.

Таким образом, в приведенном выше примере ответ должен быть 1.

Если я перевыпишу приведенные выше данные:

b<-a[sample(1:nrow(a),replace=T),]
dput(b)

structure(list(V1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), V2 = c(5, 
35.15, 0.55, 19.96666667, 0.55, 19.96666667, 0.55, 3.125, 0.9, 
0.55)), na.action = structure(260:270, .Names = c("260", 
"261","262", "263", "264", "265", "266", "267", "268", "269", 
"270"), class = "omit"), row.names = c("250", "251", "317", 
"185","317.1", "185.1", "317.2", "202", "6", "317.3"), class = 
"data.frame")

Здесь ответ должен быть 0.

Как я могу получить эти значения с помощью однострочной команды в R? это возможно?

Буду признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Вот вариант с rleid из data.table

library(data.table)
nrow(setDT(s1)[, if(all(V2 < 1)) .N, rleid(V2 < 1)])
#[1] 1
1 голос
/ 24 апреля 2020

Использование rle:

with(rle(s1$V2 < 1), sum(lengths[values] >= 3))
#[1] 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...