#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
это не функция, это временная переменная, созданная в коде — для нее не нужен никакой пакет