我有一个看起来像这样的数据框。
License.Number, DateFormatted
A019, 2018-09-20
A019, 2018-09-21
A020, 2018-09-21
我想删除具有重复许可证编号的行,但仅保留具有最早DateFormatted
数据的行。
如何在R中执行此操作?
答案 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
在两种情况下,我们都确保DateFormatted
是Date
对象,按License.Number
和DateFormatted
(从最早到最新)对行进行排序,然后仅保留第一个条目根据{{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")