2017-10-11 5 views
1

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 
> 

Répondre

1

Essayons

dat %>% group_by(GenIndID) %>% 
    mutate(AAA = max(SurveyDt, na.rm=T), 
     BBB = as.POSIXct(ifelse(Fate == "Alive", max(SurveyDt, na.rm=T), NA), origin='1970-01-01', na.rm=T)) %>% 
    as.data.frame() 


Hope this helps!

+0

merci beaucoup @Prem. Pourquoi l'ajout de l'enveloppe 'as.POSIXct' pour BBB change-t-il les résultats pour AAA? –

+0

@ 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