выберите следующую неидентичную дату во фрейме данных - PullRequest
0 голосов
/ 19 сентября 2018

Я хотел бы указать дату окончания приема препарата, где дата окончания определяется как первая дата, когда препарат не зарегистрирован.У меня есть следующие три препарата, которые можно назначить a, b, c и даты их регистрации

Drug <- c("a","b","a","b","c","a","c","a","c","c")

Date <- c("2018-09-20","2018-09-20" , "2018-09-21","2018-09-21","2018-09-21",
     "2018-09-22" ,"2018-09-22" ,"2018-09-23","2018-09-23",
     "2018-09-24")
Dates <- cbind(Drug,Date)


     Drug    Date         
[1,] "a"  "2018-09-20"
[2,] "b"  "2018-09-20"
[3,] "a"  "2018-09-21"
[4,] "b"  "2018-09-21"
[5,] "c"  "2018-09-21"
[6,] "a"  "2018-09-22"
[7,] "c"  "2018-09-22"
[8,] "a"  "2018-09-23"
[9,] "c"  "2018-09-23"
[10,] "c"  "2018-09-24"

Я бы хотел, чтобы мой финальный стол выглядел такэто:

end <- c("2018-09-24","2018-09-22" ,"2018-09-24","2018-09-22" ,NA,"2018-09-24",
          NA,"2018-09-24",NA,NA)

Dates <- cbind(Dates,end)


Drug      res          end         
 "a"  "2018-09-20"  "2018-09-24"
 "b"  "2018-09-20"  "2018-09-22"
 "a"  "2018-09-21"  "2018-09-24"
 "b"  "2018-09-21"  "2018-09-22"
 "c"  "2018-09-21"  NA          
 "a"  "2018-09-22"  "2018-09-24"
 "c"  "2018-09-22"  NA          
 "a"  "2018-09-23"  "2018-09-24"
 "c"  "2018-09-23"  NA          
 "c" "2018-09-24"   NA 

1 Ответ

0 голосов
/ 19 сентября 2018

Во-первых, я бы преобразовал ваш набор данных во фрейм данных, чтобы упростить несколько манипуляций.Я бы сделал «вспомогательный» фрейм данных для хранения уникальной конечной даты для каждого лекарства, а затем соединил бы эти даты с вашим исходным набором данных.

Попутно я бы также сделал небольшую вспомогательную функцию, которая находитдата после данной даты.(Исходя из появления НС в желаемом растворе, я предполагаю, что когда вы говорите «первая дата, когда лекарство не зарегистрировано», вы подразумеваете первую дату в списке дат , а не толькоследующий календарный день.)

library(dplyr)

Dates = as.data.frame(Dates, stringsAsFactors = FALSE)

next_date <- function(one_date, all_dates) {
    all_dates <- sort(unique(all_dates))
    return(all_dates[which(one_date == all_dates)[[1]] + 1])
}

end_dates <- group_by(Dates, Drug)
end_dates <- summarize(end_dates, end = next_date(max(Date), Dates$Date))

Dates = left_join(Dates, end_dates)
...