Quand tu fais appel a mutate de dplyr, alors sur ce quoi tu vas travailler c'est sur le vecteur de données contenu dans la colonne à laquelle tu fais appel. Quand tu fais tab %>% mutate(fun(date_j)) tu appliques bien la fonction fun sur l'ensemble des données contenues dans la colonne date_j. Ca revient à faire fun(tab$date_j). Tu travailles en vectoriel, tu ne fais fun(tab$date_j[1]) puis fun(tab$date_j[2]), fun(tab$date_j[3]), ...
Il faut raisonner en vectoriel. Quand tu as deux vecteurs de longueurs différentes que tu utilises ensemble dans la même commande, alors le plus petit est recyclé pour que toutes les opérations puissent avoir lieu sur le vecteur le plus long.
Par exemple :
Si tu multiplies x par y et bien y est trop court par rapport à x, donc les valeurs de y vont être recyclées.
Si tu n'avais pas ce recyclage, alors seules les 3 premières valeurs de x seraient multipliées par les valeurs de y.
C'est ton problème ici. Tu as les valeurs d'un vecteur (ta colonne) que tu compares à un autre vecteur de longueur 2. Donc ce dernier est recyclé, et au lieu de comparer chaque valeur de ta colonne avec tes deux intervalles, tu les compares qu'avec un seul des 2.
Le case_when peut fonctionner mais il faut expliciter les comparaisons aux deux intervalles de chaque vecteur.
Code : Tout sélectionner
licksdf %>% mutate(date_j = ymd(date_j),
testgrp2 = case_when(date_j %within% intpr[1] ~ "postpr",
date_j %within% intpr[2] ~ "postpr",
date_j %within% intpu[1] ~ "postpu",
date_j %within% intpu[2] ~ "postpu",
TRUE ~ "at"))
# equivalent a
licksdf %>% mutate(date_j = ymd(date_j),
testgrp2 = case_when(date_j %within% intpr[1] | date_j %within% intpr[2] ~ "postpr",
date_j %within% intpu[1] | date_j %within% intpu[2]~ "postpu",
TRUE ~ "at"))
Avec dplyr tu peux travailler en 'ligne' avec rowwise, mais je ne suis pas sur qu'ici ça soit très efficace si jamais tu venais à avoir beaucoup de lignes. Il vaut mieux travailler en vectoriel.
Code : Tout sélectionner
licksdf %>%
mutate(date_j = ymd(date_j)) %>%
rowwise() %>%
mutate(testgrp2 = case_when(any(date_j %within% intpr) ~ "postpr",
any(date_j %within% intpu) ~ "postpu",
TRUE ~ "at"
))
Cordialement,
Maxime