Как получить только строки с идентификатором, где дата раньше, чем другая строка с таким же идентификатором? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть фрейм данных, который выглядит примерно так.

License.Number, DateFormatted
A019, 2018-09-20
A019, 2018-09-21
A020, 2018-09-21

Я хочу удалить строки с дублирующимися номерами лицензий, но сохранить только те, у которых самые ранние данные DateFormatted.

Как мне это сделать в R?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вот два варианта (при условии DateFormatted - это класс Date):

## option 1: with base R
df[!duplicated(df[, "DateFormatted"], fromLast = FALSE), ]
# output
  License.Number DateFormatted
1           A019    2018-09-20
2           A019    2018-09-21
## option 2: with dplyr
library(dplyr)
df %>%
  group_by(License.Number) %>%
  slice(which.min(DateFormatted))
# output
# A tibble: 2 x 2
# Groups:   License.Number [2]
  License.Number DateFormatted
           <chr>        <date>
1           A019    2018-09-20
2           A020    2018-09-21

Данные

df <- structure(list(License.Number = c("A019", "A019", "A020"), DateFormatted = structure(c(17794, 
17795, 17795), class = "Date")), .Names = c("License.Number", 
"DateFormatted"), row.names = c(NA, -3L), class = "data.frame")
0 голосов
/ 05 октября 2018

A tidyverse опция

library(tidyverse)
df %>%
    mutate(DateFormatted = as.Date(DateFormatted)) %>%
    arrange(License.Number, DateFormatted) %>%
    group_by(License.Number) %>%
    filter(row_number(License.Number) == 1)
## A tibble: 2 x 2
## Groups:   License.Number [2]
#  License.Number DateFormatted
#  <fct>          <date>
#1 A019           2018-09-20
#2 A020           2018-09-21

Или в базе, используя duplicated

df$DateFormatted <- as.Date(df$DateFormatted)
df[order(df$License.Number, df$DateFormatted), ]
df[!duplicated(df$License.Number), ]
#  License.Number DateFormatted
#1           A019    2018-09-20
#3           A020    2018-09-21

В обоих случаях мы гарантируем, что DateFormatted является Date объектом, сортировкастроки на License.Number и DateFormatted (от самого раннего к последнему), а затем сохраняют только первую запись для Licence.Number.


Пример данных

df <- read.table(text =
    "License.Number DateFormatted
A019 2018-09-20
A019 2018-09-21
A020 2018-09-21", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...