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

Я получил фрейм данных с одинаковыми значениями для каждой переменной, но с разными датами начала и окончания.

I sh, чтобы уменьшить фрейм данных, удалив дублирующиеся строки, не учитывая даты начала или окончания. Затем мне нужно сохранить для каждой строки значение, для переменной даты начала, минимум, заданный для дублированной строки, и сделать то же самое с максимумом. Обратите внимание, что значение NA может быть предоставлено переменными Date_Begin и Date_End.

Я знаю, как это сделать с al oop. Я ищу лучшее решение, возможно, используя пакеты plyr / dyplr, в которых я еще не очень уверен.

смотри ниже, что я использую в настоящее время. Я уверен, что лучший «конвейер» возможен, но пока не удалось его сделать.

my 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`

l oop, который работает но, вероятно, не лучший вариант

`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)
`

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020
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

Создано в 2020-04-22 пакетом представ (v0.3.0)

1 голос
/ 22 апреля 2020

Можно попробовать

dat %>% 
  group_by(id1, id2, id3) %>% 
  summarise(min(Date_Begin),max(Date_End))
...