Функция R для поиска потенциально мертвых особей в наборе данных

#r

#r

Вопрос:

У меня есть набор данных с ежедневными наблюдениями за людьми с 2015 по 2020 год. Я хочу попросить R дать мне «предполагаемых мертвых» (людей, которых не видели в течение года). Есть ли функция, в которой я могу спросить, кто считается мертвым в этом месяце? Например, я хочу ввести месяц и год, а затем R распечатает мне список всех предполагаемых умерших в этом месяце (или на определенную дату, поскольку у меня также есть столбец даты).

Вот подмножество моего набора данных

 BIRD_data = structure(
  list(
    ID = c(
      "FB37324",
      "FB37519",
      "FB37552",
      "FA72407",
      "FA42378",
      "FB37452",
      "FA42242",
      "FB37402",
      "FB37352",
      "FC10654",
      "FB37330",
      "FB37643",
      "FB37530",
      "FB37594",
      "FB37474",
      "FB37421",
      "FA42236",
      "FB37593",
      "FC10729",
      "FC10666"
    ),
    Name = c(
      "Rocket",
      "Dirkie",
      "Zumba",
      "Cake",
      "Hula",
      "Prickles",
      "Corsair",
      "Tigger",
      "Amarula",
      "Clapham",
      "Bidou",
      "Justin",
      "Pluto",
      "Sang",
      "Fawkes",
      "Cherry",
      "Hurricane",
      "Tan?",
      "Doobidoo",
      "Lucifer"
    ),
    Lring = c(
      "",
      "",
      "",
      "",
      "LB/ID",
      "ID",
      "",
      "ID",
      "DB/ID",
      "ID/WT",
      "MV",
      "LG",
      "",
      "DB/ID",
      "",
      "",
      "",
      "",
      "ID",
      "ID/DB"
    ),
    Rring = c(
      "",
      "",
      "",
      "",
      "RD",
      "MV/LB",
      "",
      "O/BK",
      "WT",
      "O",
      "O/ID",
      "ID/MV",
      "",
      "YL",
      "",
      "",
      "",
      "",
      "MV/DG",
      "DB"
    ),
    sex = c(
      "M",
      "F",
      "M",
      "F",
      "F",
      "F",
      "F",
      "U",
      "M",
      "J",
      "M",
      "F",
      "M",
      "F",
      "F",
      "U",
      "F",
      "U",
      "J",
      "U"
    ),
    month = c(
      2L,
      1L,
      4L,
      12L,
      6L,
      3L,
      9L,
      8L,
      8L,
      6L,
      9L,
      7L,
      2L,
      4L,
      8L,
      10L,
      9L,
      9L,
      11L,
      8L
    ),
    year = c(
      2017L,
      2017L,
      2015L,
      2015L,
      2017L,
      2020L,
      2016L,
      2017L,
      2017L,
      2018L,
      2018L,
      2020L,
      2016L,
      2018L,
      2016L,
      2016L,
      2016L,
      2016L,
      2018L,
      2020L
    ),
    seen = c(
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L,
      1L
    ),
    Freq = c(
      3L,
      9L,
      9L,
      11L,
      10L,
      3L,
      19L,
      14L,
      8L,
      4L,
      9L,
      9L,
      6L,
      7L,
      9L,
      6L,
      14L,
      17L,
      10L,
      5L
    ),
    day = c(
      "21",
      "8",
      "18",
      "1",
      "24",
      "5",
      "6",
      "26",
      "18",
      "5",
      "5",
      "1",
      "26",
      "19",
      "13",
      "20",
      "9",
      "30",
      "20",
      "5"
    ),
    location = c(
      "A",
      "S",
      "A",
      "S",
      "S",
      "A",
      "A",
      "A",
      "A",
      "S",
      "A",
      "S",
      "A",
      "A",
      "A",
      "A",
      "S",
      "A",
      "S",
      "SF"
    ),
    Date = structure(
      c(
        1487620800,
        1483819200,
        1429300800,
        1448913600,
        1498248000,
        1583352000,
        1473105600,
        1503691200,
        1.503e 09,
        1528142400,
        1536091200,
        1593547200,
        1456430400,
        1524081600,
        1471032000,
        1476907200,
        1473364800,
        1475179200,
        1542657600,
        1596571200
      ),
      tzone = "",
      class = c("POSIXct", "POSIXt")
    )
  ),
  row.names = c(NA,-20L),
  class = c("tbl_df", "tbl", "data.frame")
)
 

Ответ №1:

Вы можете попробовать эту функцию :

 library(dplyr)

dead_birds <- function(data, date) {
  data %>%
    group_by(ID) %>%
    mutate(last_seen =  as.Date(max(Date))) %>%
    filter(last_seen < date - lubridate::years(1)) %>%
    select(ID, Name, last_seen) %>%
    distinct()
}

result <- dead_birds(BIRD_data, as.Date('2019-12-01'))
 

Комментарии:

1. Он показывает мне это сообщение об ошибке: результат <- dead_birds(BIRD_data, as.Date(’01-02-2019′)) Ошибка в (функция (классы, fdef, mtable): не удалось найти унаследованный метод для функции ‘group_by’ для подписи ‘»tbl_df»’

2. Возможно, у вас конфликтуют функции из других пакетов. Попробуйте добавить dplyr:: перед функциями. Итак dplyr::group_by , dplyr::mutate и т.д.

3. Я также хочу знать «предполагаемый живой» итак, каждый человек, которого видели за последние 11 месяцев. Я думаю, мне просто нужно изменить строку «фильтр»? filter(last_seen <= date — lubridate::месяцы(11)) %>% Это правильно?

4. Я думаю, вам также нужно убедиться, что last_seen это не больше, чем пройденные даты? Возможно, использовать : filter(between(last_seen, date - lubridate::month(11), date))

5. @Andre230 Пожалуйста, не задавайте вопрос в комментариях. Задайте это как новый вопрос.

Ответ №2:

 your_date <- as.Date('2020-12-01')
date_diff <- your_date - as.Date(BIRD_data$Date)
BIRD_data[date_diff>365,]
 

Комментарии:

1. Это даст только людей, которые появились один или более лет назад. Я думаю, что правильная логика with(BIRD_data, BIRD_data[date_diff > 365 amp; !ID %in% ID[date_diff <= 365]]) (появилась один или несколько лет назад, но не была замечена в этом году)

2. да, вы правы, у меня было (неправильное) предположение, что каждое имя присутствует в таблице только один раз

3. Спасибо! Я пытаюсь просмотреть пакет для вашей функции «date_diff», но я ее не нахожу…

4. date_diff это не функция, это временная переменная, созданная в коде — для нее не нужен никакой пакет