У меня есть данные с тремя категориями наблюдений: «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")