使用 R,如何删除重复行并通过重复保留最小开始日期和最大结束日期

With R, how to delete duplicate rows and to keep the minimum starting date and maximum ending date by duplicates

我得到了一个数据框,每个变量的值都相同,但开始日期和结束日期不同。

我希望通过删除重复行来减少数据框,而不考虑开始日期或结束日期。然后我需要为每一行保留作为值,为开始日期变量,为重复行给出的最小值,并对最大值做同样的事情。请注意,变量 Date_Begin 和 Date_End.

可以提供 NA 值

我知道如何用循环来完成。我正在寻找一个更好的解决方案,也许使用我还不是很有信心的包 plyr/dyplr。

请参阅下面我目前使用的内容。我相信更好的 "pipeline" 是可能的,但到目前为止还没有成功。

我的 data.frame 之前 :

`head(dat)
id1 id2 id3 Date_Begin Date_End
FR1 1     A   2019-12-16 2019-12-18
FR1 1     A   2019-12-19 2020-01-16
FR2 3     B   2020-01-07 2020-01-10
FR2 4     C   2020-01-12 2020-02-03
FR1 5     A   2020-01-17 2020-02-03
FR3 6     D   2020-01-22 2020-02-03`

有效但可能不是最佳选择的循环

`dat$key <- paste(dat$id1, dat$id2, dat$id3, sep = "_")
dat2 <- distinct(data.frame(id1 = dat$id1, id2 = dat$id2, id3 = dat$id3, Date_Begin = NA, Date_End = NA, key = dat$key))
dat2 <- data.frame(lapply(dat2, as.character), stringsAsFactors=FALSE)
N <- dim(dat2)[1]
for(i in 1 : N)
    {
    x <- which(dat$key == dat2$key[i])
    y <- which.min(dat$Date_Begin[x])
    z <- which.max(dat$Date_End[x])
    dat2$Date_Begin[i] <- ifelse(length(y) > 0, as.character(dat$Date_Begin[x][y]), NA)
    dat2$Date_End[i] <- ifelse(length(z) > 0, as.character(dat$Date_End[x][z]), NA)
    }
dat <- dat2 ; rm(dat2)
dat$Date_Begin <- parse_date(dat$Date_Begin, approx = TRUE, default_tz = "UTC")
dat$Date_End <- parse_date(dat$Date_End, approx = TRUE, default_tz = "UTC")
dat$key <- NULL`

我的 data.frame 之后:

`head(dat)
id1 id2 id3 Date_Begin Date_End
FR1 1     A   2019-12-16 2020-01-16
FR2 3     B   2020-01-07 2020-01-10
FR2 4     C   2020-01-12 2020-02-03
FR1 5     A   2020-01-17 2020-02-03
FR3 6     D   2020-01-22 2020-02-03`

我在下面用 dplyr 做了几次这样的尝试,但没有找到正确的解决方案。

`
dat <- dat %>%
group_by(id1, id2, id3) %>% 
slice(which.max(Date_End)
`

感谢您的帮助。

你可以试试

dat %>% 
  group_by(id1, id2, id3) %>% 
  summarise(min(Date_Begin),max(Date_End))
library(dplyr)
df <- readr::read_table2("id1 id2 id3 Date_Begin Date_End
FR1 1     A   2019-12-16 2019-12-18
FR1 1     A   2019-12-19 2020-01-16
FR2 3     B   2020-01-07 2020-01-10
FR2 4     C   2020-01-12 2020-02-03
FR1 5     A   2020-01-17 2020-02-03
FR3 6     D   2020-01-22 2020-02-03")

group_by(df, id1, id2, id3) %>% 
  summarise(Date_Begin = min(Date_Begin), Date_End = max(Date_End)) %>% 
  ungroup()
#> # A tibble: 5 x 5
#>   id1     id2 id3   Date_Begin Date_End  
#>   <chr> <dbl> <chr> <date>     <date>    
#> 1 FR1       1 A     2019-12-16 2020-01-16
#> 2 FR1       5 A     2020-01-17 2020-02-03
#> 3 FR2       3 B     2020-01-07 2020-01-10
#> 4 FR2       4 C     2020-01-12 2020-02-03
#> 5 FR3       6 D     2020-01-22 2020-02-03

reprex package (v0.3.0)

于 2020-04-22 创建