2017-10-04 4 views
0

Ich habe einen Datenrahmen namens "Einschreibungen":Wie kann ich den Unterschied zwischen zwei Daten im Faktor finden?

"enrollments" data frame

enrolled_at, unenrolled_at und fully_participated_at Faktoren sind. Ich möchte meinem Datenrahmen eine neue Spalte hinzufügen, die die Unterschiede in Stunden zwischen zwei nicht leeren Attributen angibt. Der Typ dieser neuen Spalte ist nicht wichtig, aber sie muss Zeit in diesem Format anzeigen (HH MM SS).

Ich möchte folgende Pseudo-Code tun:

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: Ich habe versucht, alle Methoden in der Website, dies zu tun, aber sie funktioniert nicht. Zeiten, die als Faktorklasse in meinem Datenrahmen gespeichert sind, aber Lösungen in der Site sind Faktor - Faktor oder (String) Zeit - (String) Zeit. Ich habe auch "as.character" und "as.Date" -Funktionen ausprobiert. Also meine Frage ist nicht doppelt. Rolando Tamayo bietet verschiedene Verfahren, mein Problem zu lösen, aber es gibt mir eine Fehlermeldung: „Fehler in ymd_hms (Kommentare $ unenrolled_at): konnte nicht Funktion finden‚ymd_hms‘“ (I lubridate Paket installiert)

+4

bitte Ihre Daten als editierbaren Text enthalten, anstelle des Bildes –

+3

ersten Zeichen Konvertieren mit 'as.character', wandeln dann das Datumsformat mit' as.Date' – useR

+0

Ich versuchte es vor die Frage stellen aber es gab diesen Fehler: Fehler in charToDate (x): Zeichenkette ist nicht in einem Standard unzweideutigen Format --- Erprobter Befehl: Difftime (as.Date (as.character (Einschreibungen $ unenrolled_at)) - as.Date (als .character (Einschreibungen $ immatrikulierte_))) –

Antwort

1

Sie Paket verwenden können 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 
Verwandte Themen