сохранить самые последние наблюдения, когда есть дубликаты в R - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующие данные.

  date                         var1    level       score_1     score_2
   2020-02-19 12:10:52.166661    dog      n1           1           3
   2020-02-19 12:17:25.087898    dog      n1           3           6
   2020-02-19 12:34:27.624939    dog      n2           4           3
   2020-02-19 12:35:50.522116    cat      n1           2           0
   2020-02-19 12:38:49.547181    cat      n2           3           4

Для любой комбинации var1 & level должно быть только одно наблюдение. Я хочу устранить дубликаты и хранить только самые последние записи. в предыдущем примере первый ряд должен быть исключен, поскольку dog-n1 из ряда 2 является более поздним. тем не менее, я хочу сохранить строку 3, даже если var1 также равен «собака», потому что уровень отличается.

Итак, что я хочу получить:

  date                         var1    level       score_1     score_2
   2020-02-19 12:17:25.087898    dog      n1           3           6
   2020-02-19 12:34:27.624939    dog      n2           4           3
   2020-02-19 12:35:50.522116    cat      n1           2           0
   2020-02-19 12:38:49.547181    cat      n2           3           4

Ответы [ 3 ]

3 голосов
/ 24 февраля 2020

Использование tidyverse

df %>%
group_by(var1, level) %>%
filter(date == max(date)) %>%
ungroup()
2 голосов
/ 24 февраля 2020

В базе R используйте duplicated. Похоже, ваши данные уже отсортированы по дате, поэтому вы можете использовать

df[!duplicated(df[c("var1", "level")], fromLast = TRUE), ]

(по умолчанию duplicated даст FALSE для первого вхождения чего-либо и TRUE для каждого другого вхождения. Установка fromLast = TRUE приведет к изменению направления, поэтому вхождение last сохраняется)

Если вы не уверены, что ваши данные уже отсортированы, выполните сортировку первый!

df = df[order(df$var1, df$level, dfd$date), ]
1 голос
/ 24 февраля 2020

Вы также можете использовать data.table подход следующим образом:

library(data.table)
setDT(df)[, .SD[which.max(date)], .(var1, level)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...