Les données ci-dessous ont un certain nombre de dates d'observation pour deux individus.maintenir le format d'heure POSIXct avec ifelse et dplyr
dat <- structure(list(GenIndID = c("BHS_034", "BHS_034", "BHS_068",
"BHS_068", "BHS_068", "BHS_068", "BHS_068", "BHS_068", "BHS_068",
"BHS_068", "BHS_068"), IndID = c("BHS_034_A", "BHS_034_A", "BHS_068_A",
"BHS_068_A", "BHS_068_A", "BHS_068_A", "BHS_068_A", "BHS_068_A",
"BHS_068_A", "BHS_068_A", "BHS_068_A"), Fate = c("Mort", "Mort",
"Alive", "Alive", "Alive", "Alive", "Alive", "Alive", "Alive",
"Alive", "Alive"), SurveyID = c("GYA13-1", "GYA14-1", "GYA13-1",
"GYA14-1", "GYA14-2", "GYA15-1", "GYA16-1", "GYA16-2", "GYA17-1",
"GYA17-3", "GYA15-2"), SurveyDt = structure(c(1379570400, 1407477600,
1379570400, 1407477600, 1409896800, NA, 1462946400, 1474351200,
1495519200, 1507010400, 1441951200), tzone = "", class = c("POSIXct",
"POSIXt"))), row.names = c(NA, 11L), .Names = c("GenIndID", "IndID",
"Fate", "SurveyID", "SurveyDt"), class = "data.frame")
> dat
GenIndID IndID Fate SurveyID SurveyDt
1 BHS_034 BHS_034_A Mort GYA13-1 2013-09-19
2 BHS_034 BHS_034_A Mort GYA14-1 2014-08-08
3 BHS_068 BHS_068_A Alive GYA13-1 2013-09-19
4 BHS_068 BHS_068_A Alive GYA14-1 2014-08-08
5 BHS_068 BHS_068_A Alive GYA14-2 2014-09-05
6 BHS_068 BHS_068_A Alive GYA15-1 <NA>
7 BHS_068 BHS_068_A Alive GYA16-1 2016-05-11
8 BHS_068 BHS_068_A Alive GYA16-2 2016-09-20
9 BHS_068 BHS_068_A Alive GYA17-1 2017-05-23
10 BHS_068 BHS_068_A Alive GYA17-3 2017-10-03
11 BHS_068 BHS_068_A Alive GYA15-2 2015-09-11
La colonne SurveyDt est formaté comme un horodatage POSIXct
. J'essaie de résumer la date maximale dans le groupe GenIndID
avec dplyr
. Dans le code ci-dessous, j'utilise dplyr
pour créer deux nouvelles colonnes. Pour AAA
pourquoi sont <NA>
produit pour le 2ème individu lorsque la fonction max utilise l'argument na.rm = F
? Pour BBB
, je veux résumer une valeur maximale pour les individus vivants, mais obtenir toutes les valeurs NA
(reconnu comme un facteur plutôt que <NA>
qui est préféré).
dat %>% group_by(GenIndID) %>%
mutate(AAA = max(SurveyDt, na.rm = FALSE),
BBB = ifelse(Fate == "Alive", max(SurveyDt, na.rm = F), NA)) %>%
as.data.frame()
GenIndID IndID Fate SurveyID SurveyDt AAA BBB
1 BHS_034 BHS_034_A Mort GYA13-1 2013-09-19 2014-08-08 NA
2 BHS_034 BHS_034_A Mort GYA14-1 2014-08-08 2014-08-08 NA
3 BHS_068 BHS_068_A Alive GYA13-1 2013-09-19 <NA> NA
4 BHS_068 BHS_068_A Alive GYA14-1 2014-08-08 <NA> NA
5 BHS_068 BHS_068_A Alive GYA14-2 2014-09-05 <NA> NA
6 BHS_068 BHS_068_A Alive GYA15-1 <NA> <NA> NA
7 BHS_068 BHS_068_A Alive GYA16-1 2016-05-11 <NA> NA
8 BHS_068 BHS_068_A Alive GYA16-2 2016-09-20 <NA> NA
9 BHS_068 BHS_068_A Alive GYA17-1 2017-05-23 <NA> NA
10 BHS_068 BHS_068_A Alive GYA17-3 2017-10-03 <NA> NA
11 BHS_068 BHS_068_A Alive GYA15-2 2015-09-11 <NA> NA
>
merci beaucoup @Prem. Pourquoi l'ajout de l'enveloppe 'as.POSIXct' pour BBB change-t-il les résultats pour AAA? –
@ B.Davis Heureux que cela a aidé! Selon votre exigence, la colonne 'AAA' a le maximum de' SurveyDt' pour chaque groupe 'GenIndID' et la colonne' BBB' a un maximum de 'SurveyDt' pour' Fate == "Alive" 'seulement. Ici 'as.POSIXct' est ajouté car la condition' ifelse' dans 'BBB' convertit le temps en UNIX époque mais la sortie désirée est dans un format différent. – Prem