J'ai un ensemble de données, df
comme suit:Extraire la date la plus proche avant une date fixée dans r
df <- read.table(text = "
ID INDEX_DATE DATE VALUE
1 14/06/2017 16/02/2015 7
1 14/06/2017 16/02/2015 6.5
1 14/06/2017 21/07/2015 7
1 14/06/2017 08/09/2015 9.5
1 14/06/2017 04/12/2015 8.9
1 14/06/2017 28/01/2016 8.4
1 14/06/2017 30/03/2016 8.2
1 14/06/2017 25/05/2016 7.6
1 14/06/2017 17/08/2016 8.2
1 14/06/2017 16/11/2016 8
1 14/06/2017 18/01/2017 8.8
1 14/06/2017 24/03/2017 9.1
1 14/06/2017 14/06/2017 7.9
1 14/06/2017 14/06/2017 8.0
2 10/01/2017 26/03/2015 7.4
2 10/01/2017 26/03/2015 7.7
2 10/01/2017 14/04/2016 7
2 10/01/2017 03/04/2017 7.6
3 14/01/2015 06/05/2015 7.2
3 14/01/2015 29/07/2015 7.1
3 14/01/2015 18/11/2015 7.2
3 14/01/2015 17/02/2016 7.3
3 14/01/2015 03/08/2016 7.3
4 08/12/2016 NA NA
", header = TRUE, stringsAsFactors = FALSE)
je voudrais extraire le VALUE
qui correspond au plus proche DATE
avant la INDEX_DATE
pour chaque ID
. S'il n'y a pas de DATE
avant le INDEX_DATE
, alors le DATE
le plus proche après INDEX_DATE
sera utilisé à la place.
Il y a 3 cas:
ID == 1
: A seulementDATE
s avant (ou même date que) leINDEX_DATE
ID == 2
: ADATE
s avant et après laINDEX_DATE
ID == 3
: Seulement aDATE
après leINDEX_DATE
Si le DATE
choisi a plus de 1 valeur, je choisirais au hasard l'un d'eux.
Ma sortie désirée:
df2 <- read.table(text = "
ID INDEX_DATE DATE VALUE
1 14/06/2017 14/06/2017 7.9
2 10/01/2017 14/04/2016 7
3 14/01/2015 06/05/2015 7.2
4 08/12/2016 NA NA
", header = TRUE, stringsAsFactors = FALSE)
J'ai essayé d'écrire mon code, mais cela ne fonctionnerait pas sur le second cas (c.-à-ID == 2
):
library(lubridate); library(dplyr)
df2 <- df %>%
mutate_at(vars(INDEX_DATE, DATE), funs(dmy)) %>%
mutate(DATEDIFF = (INDEX_DATE - DATE)) %>%
group_by(ID) %>%
mutate(PRIORPOST = if_else(any(DATEDIFF >= 0), "PRIOR", "POST_ONLY"),
CHOSEN_VALUE = if_else(PRIORPOST == "PRIOR" & DATEDIFF >= 0 & DATEDIFF == min(DATEDIFF), VALUE,
if_else(PRIORPOST == "POST_ONLY" & DATEDIFF < 0 & DATEDIFF == max(DATEDIFF), VALUE, NA_real_))) %>%
filter(!is.na(CHOSEN_VALUE))