J'ai un quadrillage de données de levé. Chaque rangée représente une entrevue avec un «répondant». Certains répondants ont été interviewés une fois; d'autres ont été interviewés plusieurs fois. Je veux sélectionner, à partir de ce fichier, seulement la dernière interview pour chaque répondant.tidyverse: suppression des rangées de la trame de données sur la base des valeurs des autres rangées
Voici un exemple minimal:
tmp <- tribble(
~YYYYMM, ~ID, ~DATEPR, ~IDPREV,
198001, 1, NA, NA,
198001, 2, NA, NA,
198001, 3, NA, NA,
198002, 1, 198001, 1,
198002, 2, NA, NA,
198002, 3, NA, NA,
198003, 1, 198002, 1,
198003, 2, NA, NA,
198003, 3, 198002, 3)
où
YYYYMM
est la date d'une entrevue.DATEPR
est la date de l'interview précédente du répondant, s'il y en avait une.ID
est unique seulement dans les vagues d'interview. Cela signifie, par exemple, que le répondant pour lequelID==2
etYYYMM==198001
n'a pas besoin d'être le répondant pour quiID==2
etYYYMM==198002
.IDPREV
est l'ID de l'interview précédente du répondant, s'il y en avait une.
Il y a neuf rangées dans le quadrilatère ci-dessus. Mais un répondant a été interviewé trois fois, et un autre a été interviewé deux fois. Je ne veux que la dernière interview pour chaque répondant, donc je veux un pépin avec seulement six rangées. Ce code fait le travail:
for (i in 1:nrow(tmp)) {
if (!is.na(tmp$DATEPR[i])) {
ind <- which(tmp$YYYYMM == tmp$DATEPR[i] & tmp$ID == tmp$IDPREV[i])
tmp <- tmp[-ind, ]
}
}
Mais il semble un peu difficile à analyser. Existe-t-il un moyen plus clair d'atteindre le même but avec les fonctions tidyverse? J'ai en tête une fonction en deux étapes: d'abord, obtenir les indices de toutes les lignes à supprimer; Deuxièmement, supprimez les lignes. Mais je n'ai pas été en mesure d'implémenter cette solution avec map
ou avec les fonctions dplyr
.
Merci. Je n'avais pas pensé à utiliser 'anti_join' avec seulement une trame de données. – user697473