Исправить совокупные вхождения наблюдений - PullRequest
1 голос
/ 30 марта 2020

У меня есть данные с тремя категориями наблюдений: «AR», «AM» и «AA».

Эта категория повторяется в соответствии с другой переменной. Если значения в другом столбце> = -200, категория «AR». Если значения <-200, категория будет «AM» (-200 - это значение батиметра c). Другой уровень создается на основе других параметров (широта и долгота). </p>

В некоторых случаях киты покидают 200-метровую изобату, но возвращаются через короткий промежуток времени / мест. Но, поскольку я классифицировал области только в соответствии с батиметрией, когда животное покидает этот изобат, область классифицируется как «AM», но она должна быть «AR».

Мои данные выглядят так:

 date.sec bmode bmode.5       ID sex     timestamp_posix       dist dt      speed  angulo
1 -61795677600 1.421       1 111868.1   M 0011-10-10 06:00:00  0.3655816  6 0.06093026      NA
2 -61795656000 1.396       1 111868.1   M 0011-10-10 12:00:00  5.5301500  6 0.92169168  41.027
3 -61795634400 1.375       1 111868.1   M 0011-10-10 18:00:00 17.9405838  6 2.99009730 -43.410
4 -61795612800 1.346       1 111868.1   M 0011-10-11 00:00:00 12.8256545  6 2.13760908  29.056
5 -61795591200 1.248       1 111868.1   M 0011-10-11 06:00:00 19.5562989  6 3.25938315  18.241
6 -61795569600 1.074       1 111868.1   M 0011-10-11 12:00:00 49.0420474  6 8.17367457  -7.125
   angle_rel bat.depth area seq rle
1         NA       -77   AR   1   1
2  0.7160619       -45   AR   2   1
3 -0.7576522      -397   MI   1   2
4  0.5071251       -32   AR   1   3
5  0.3183724       -29   AR   2   3
6 -0.1243479       -21   AR   3   3 

Итак, я хочу создать новый столбец «area_fixed» во фрейме данных. Если область «AM» повторяется, например, более 25 раз, и в последовательности больше нет «AR», уровень будет правильным. Если «AM» повторяется менее 25 раз и сопровождается «AR», то уровень должен измениться на «AR». Например:

area    area2
AR      AR
AR      AR
AR      AR
AM      AR
AM      AR
AR      AR
AR      AR
AR      AR
AM      AM
AM      AM
AM      AM
AM      AM
...     ...
AM      AM
AM      AM
AM      AM
AA      AA
AA      AA
...    ...
AA      AA

Это должно быть сделано для каждого животного («ID» во фрейме данных). У меня 62 идентификатора.

Я пытался что-то придумать, используя последовательность (столбец "seq")

df$seq <- sequence(rle(as.character(df$area))$lengths)

И тоже попробовал

idx <- with(rle(as.character(df$area)), rep(seq_along(lengths), lengths))
> df$area2 <- with(df, replace(area, idx < max(idx[area == 'AM']), 'AR'))

, но результат возвращает только «AR», я думаю, потому что я не разделил его по животному (ID).

Может кто-нибудь, пожалуйста, помогите мне?

РЕДАКТИРОВАТЬ 1

dput(head(tb))

structure(list(date.sec = c(-61795677600, -61795656000, -61795634400, 
-61795612800, -61795591200, -61795569600), lon = c(-38.843, -38.8745, 
-38.8676, -38.9445, -38.9811, -38.9322), lat = c(-14.0549, -14.09437, 
-14.25664, -14.34518, -14.51857, -14.95994), bmode = c(1.421, 
1.396, 1.375, 1.346, 1.248, 1.074), bmode.5 = c(1, 1, 1, 1, 1, 
1), ID = c(111868.11, 111868.11, 111868.11, 111868.11, 111868.11, 
111868.11), sex = c("M", "M", "M", "M", "M", "M"), timestamp_posix = c("0011-10-10 06:00:00", 
"0011-10-10 12:00:00", "0011-10-10 18:00:00", "0011-10-11 00:00:00", 
"0011-10-11 06:00:00", "0011-10-11 12:00:00"), dist = c(0.36558158, 
5.53015005, 17.94058378, 12.82565446, 19.55629887, 49.0420474
), dt = c(6L, 6L, 6L, 6L, 6L, 6L), speed = c(0.060930263, 0.921691675, 
2.990097297, 2.137609076, 3.259383146, 8.173674567), angulo = c(NA, 
41.027, -43.41, 29.056, 18.241, -7.125), angle_rel = c(NA, 0.7160619, 
-0.7576522, 0.5071251, 0.3183724, -0.1243479), bat.lon = c(-38.843, 
-38.8745, -38.8676, -38.9445, -38.9811, -38.9322), bat.lat = c(-14.0549, 
-14.09437, -14.25664, -14.34518, -14.51857, -14.95994), bat.depth = c(-77L, 
-45L, -397L, -32L, -29L, -21L), arcgis = c("AR", "AR", "AR", 
"AR", "AR", "AR"), area = c("AR", "AR", "MI", "AR", "AR", "AR"
), seq = c(1L, 2L, 1L, 1L, 2L, 3L)), row.names = c(NA, 6L), class = "data.frame")

...