如何只获取ID日期早于具有相同ID的另一行的ID的行?

时间:2018-10-04 21:41:43

标签: r

我有一个看起来像这样的数据框。

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

我想删除具有重复许可证编号的行,但仅保留具有最早DateFormatted数据的行。

如何在R中执行此操作?

2 个答案:

答案 0 :(得分:2)

一个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

在两种情况下,我们都确保DateFormattedDate对象,按License.NumberDateFormatted(从最早到最新)对行进行排序,然后仅保留第一个条目根据{{​​1}}。


样本数据

Licence.Number

答案 1 :(得分:2)

这里有两个选项(假设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")