Dans ma base de données, j'ai une colonne "dates" et je voudrais que R parcoure chaque ligne de dates dans une boucle pour voir si la date avant ou après elle se situe dans une plage de 3 à 14 jours, et si non, il est indexé dans une liste à supprimer à la fin de la boucle.
par exemple:
my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019")
Je voudrais supprimer toute la ligne contenant 20/02/2019
car il n'y a pas d'autre date dans les 3 à 14 jours suivant cette date.
Toute aide serait grandement appréciée!
3 Réponses :
Voici une manière détaillée d'utiliser lubridate
et dplyr
.
my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019") library(lubridate); library(dplyr) df <- data.frame(dates = mdy(my_dates)) %>% arrange(dates) %>% mutate(days_prior = dates - lag(dates), days_before = lead(dates) - dates) %>% mutate(closest_day = pmin(days_prior, days_before, na.rm = T)) %>% filter(closest_day <= 14)
N'est-ce pas censé durer entre 3 et 14 jours, pas seulement moins de 14?
Je ne savais pas trop comment interpréter «dans les 3 à 14 jours», car on peut dire que 1 à 2 jours est «à l'intérieur», c'est-à-dire inférieur à cette plage. Si vous souhaitez supprimer des éléments dont le jour est le plus proche dans la journée ou jusqu'à deux jours, nous allons simplement passer au filter (plus proche_jour> = 3, plus proche_jour <= 14)
.
Utilisez un peu de ordre
ing et diff
ing:
my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019") my_dates <- as.Date(my_dates, format="%m/%d/%Y") o <- order(my_dates) d <- abs(diff(my_dates[o])) my_dates[o[ c(Inf,d) <= 14 | c(d,Inf) <= 14 ]] #[1] "2019-01-04" "2019-01-18" "2019-04-03" "2019-04-05"
Merci! Cela a beaucoup de sens. J'ai oublié de mentionner que je suis également intéressé à faire cela par groupe. J'ai un groupe "Patient_ID" et j'aimerais que R retire les dates qui ne sont pas comprises dans la plage de 14 jours, mais uniquement s'il s'agit du même patient. Par exemple, s'il y a deux dates, mais que le 20/01/2019 appartient au patient A et le 24/01/2019 au patient B, je veux que R l'ignore. J'ai le code suivant: df <-data.table (data_2011_2018 $ Patient_ID, data_2011_2018 $ Date _of_Collection) z = df [ baseline: = Date_of_Collection - shift (Date_of_Collection), by = Patient_ID]
@ steph.zank - c'est probablement une question distincte qui s'appuie sur celle-ci. Idéalement, vous devriez publier à nouveau en fournissant un exemple simple de votre data.table
(sous une forme reproductible) et renvoyer à cette question en tant que ressource. Cela ne devrait pas être trop difficile à faire à partir de votre description, mais ce serait simplement plus facile avec une nouvelle question / données. Puisque vous utilisez également data.table
, il peut y avoir des approches totalement différentes qui évolueront beaucoup mieux pour le regroupement.
Voici un moyen depuis externe
, les données de thelatemail
s=abs(-outer(my_dates, my_dates, '-')) my_dates[rowSums(s<=14)>1] [1] "2019-01-04" "2019-01-18" "2019-04-03" "2019-04-05"