2017-10-04 3 views
0

J'ai une trame de données nommée "inscriptions":Comment puis-je trouver la différence entre deux dates dans le facteur?

"enrollments" data frame

enrolled_at, unenrolled_at et fully_participated_at sont des facteurs. Je souhaite ajouter une nouvelle colonne à mon bloc de données qui indique les différences d'heures entre deux attributs non vides. Le type de cette nouvelle colonne n'est pas important, mais il doit afficher l'heure dans ce format (HH MM SS).

Je veux faire après le code pseudo:

If (unenrolled_at == empty && fully_participated_at != empty) 
    newAttributeValue = fully_participated_at - enrolled_at 
else if (unenrolled_at != empty && fully_participated_at == empty) 
    newAttributeValue = unenrolled_at - enrolled_at 
else 
    do nothing 

Edit: J'ai essayé toutes les méthodes du site pour le faire, mais ils ne fonctionne pas. Les heures stockées en tant que classe de facteur dans ma base de données mais les solutions dans le site sont factor - factor ou (String) time - (String) time. J'ai aussi essayé les fonctions "as.character" et "as.Date" respectivement. Donc, ma question n'est pas en double. Rolando Tamayo offre méthode différente pour résoudre mon problème, mais il me donne l'erreur: "Erreur dans ymd_hms ($ comments unenrolled_at): fonction n'a pas pu trouver "ymd_hms"" (j'ai installé paquet lubridate)

+4

s'il vous plaît inclure vos données sous forme de texte modifiable, au lieu de l'image –

+3

Convertir en premier caractère avec 'as.character', puis convertir au format de la date avec' as.Date' – useR

+0

Je l'ai essayé avant de poser la question mais il a donné cette erreur: Erreur dans charToDate (x): la chaîne de caractères n'est pas dans un format standard non ambigu --- Commande essayée: difftime (as.Date (as.character (inscriptions $ unenrolled_at)) - as.Date (as .character (inscriptions $ enrolled_at))) –

Répondre

1

Vous pouvez utiliser package lubridate:

library(lubridate) 


#Create a df with dates 

df<-tibble::tibble(
    enrolled_at=as.factor(c("2002-06-09 12:45:40 UTC","2003-01-29 09:30:40 UTC", 
         "2002-09-04 16:45:40 UTC")), 
unenrolled_at=as.factor(c("2002-11-13 20:00:40 UTC", 
         "2002-07-07 17:30:40","2002-07-07 17:30:40 UTC"))) 
df 

# A tibble: 3 x 2 
       enrolled_at   unenrolled_at 
        <fctr>     <fctr> 
1 2002-06-09 12:45:40 UTC 2002-11-13 20:00:40 UTC 
2 2003-01-29 09:30:40 UTC  2002-07-07 17:30:40 
3 2002-09-04 16:45:40 UTC 2002-07-07 17:30:40 UTC 

#Check Class 
class(df$enrolled_at) 

[1] "factor" 

#Check class after function ymd_hms 
class(ymd_hms(df$enrolled_at)) 

[1] "POSIXct" "POSIXt" 

#Calculete de difference in days 
dif<-ymd_hms(df$ unenrolled_at)-ymd_hms(df$enrolled_at) 

#difference like a period 
as.period(dif) 

[1] "157d 7H 15M 0S" "-205d -16H 0M 0S" "-58d -23H -15M 0S" 

#Add as a column in df 
df$newAttributeValue<-as.period(ymd_hms(df$ unenrolled_at)-ymd_hms(df$enrolled_at)) 

df 

# A tibble: 3 x 3 
       enrolled_at   unenrolled_at newAttributeValue 
        <fctr>     <fctr>  <S4: Period> 
1 2002-06-09 12:45:40 UTC 2002-11-13 20:00:40 UTC 157d 7H 15M 0S 
2 2003-01-29 09:30:40 UTC  2002-07-07 17:30:40 -205d -16H 0M 0S 
3 2002-09-04 16:45:40 UTC 2002-07-07 17:30:40 UTC -58d -23H -15M 0S