Я получил фрейм данных с одинаковыми значениями для каждой переменной, но с разными датами начала и окончания.
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)
`
Спасибо за любую помощь.