Как я могу кумулятивно добавить строки фрейма данных до определенного числа, а затем начать сначала со следующей строки? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь определить записи в фрейме данных, которые находятся в пределах 30 минут от первой записи в 30-минутном периоде, чтобы их можно было удалить (т. Е. 30-минутный период тишины), а затем новый 30-минутный период начинается со следующей записи.Каждая запись имеет столбец времени и даты.Я успешно нашел разницу во времени для каждой записи (они уже в порядке времени), поэтому мне нужно суммировать разницу во времени, пока они не достигнут 30 минут, а затем снова начать добавлять в следующем ряду до 30минут и тд.Как я могу кумулятивно добавить строки фрейма данных (разница во времени) в новый столбец, начиная с каждого раза, когда он достиг 30 минут?

Так выглядят данные.('difftime' - это время с момента последней записи в секундах, поэтому 1800 с = 30 мин.)

Species   Time                   difftime
DEER      2019-06-12 00:20:00     NA
DEER      2019-06-12 03:41:00     12060
DEER      2019-06-12 04:30:00     2940
DEER      2019-06-12 04:58:00     1680
DEER      2019-06-12 05:08:00     600
DEER      2019-06-12 05:10:00     120
DEER      2019-06-12 05:21:00     660
DEER      2019-06-12 05:23:00     120
DEER      2019-06-12 05:44:00     1260
DEER      2019-06-12 05:45:00     60

Мне нужно добавить новый столбец, который кумулятивно добавляет 'difftime', пока он не станет больше 1800, вкоторый указывает, что он начинается снова с 0. Таким образом, это выглядело бы так ('qp' = период покоя)

Species   Time                   difftime    qp
DEER      2019-06-12 00:20:00     NA         0
DEER      2019-06-12 03:41:00     12060      0
DEER      2019-06-12 04:30:00     2940       0
DEER      2019-06-12 04:58:00     1680       1680
DEER      2019-06-12 05:08:00     600        0
DEER      2019-06-12 05:10:00     120        120
DEER      2019-06-12 05:21:00     660        720
DEER      2019-06-12 05:23:00     120        840
DEER      2019-06-12 05:44:00     1260       0
DEER      2019-06-12 05:45:00     60         60

Каждая запись, где qp = 0, обозначает начало 30-минутного периода покоя, что означаетвсе записи в течение следующих 30 минут должны быть проигнорированы.На этом этапе я бы сохранил все записи, где qp = 0, и удалил бы те, где qp> 0, потому что они попадают в 30-минутный период молчания начальной записи.

Итак, как мне создать столбец 'qp'?

1 Ответ

1 голос
/ 17 июня 2019
Reduce(function(x, y) ifelse(x + y > 1800, 0, x + y),
       replace(d$difftime, is.na(d$difftime), 0),
       accumulate = TRUE)
# [1]    0    0    0 1680    0  120  780  900    0   60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...