1
votes

comparer les lignes adjacentes dans R

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!


0 commentaires

3 Réponses :


1
votes

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)


2 commentaires

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) .



2
votes

Utilisez un peu de ordre ing et diffing:

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"


2 commentaires

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.



1
votes

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"


0 commentaires