2017-11-18 4 views
1

Ich habe einen Datenrahmen (df1) mit einer ID-Variablen und zwei Datumsvariablen (dat1 und dat2).Wie verwende ich dplyr() um Beobachtungen basierend auf dem Unterschied zwischen zwei Daten zu unterteilen

Ich möchte den Datenrahmen unterteilen, so dass ich die Beobachtungen, für die der Unterschied zwischen dat2 und dat1 ist weniger als oder gleich 30 Tage erhalten.

Ich versuche dplyr() zu verwenden, aber ich kann es nicht funktionieren.

Jede Hilfe würde sehr geschätzt werden.

Startpunkt (df):

df1 <- data.frame(ID=c("a","b","c","d","e","f"),dat1=c("01/05/2017","01/05/2017","01/05/2017","01/05/2017","01/05/2017","01/05/2017"),dat2=c("14/05/2017","05/06/2017","23/05/2017","15/10/2017","15/11/2017","15/12/2017"), stringsAsFactors = FALSE) 

Gewünschtes Ergebnis (df):

dfgoal <- data.frame(ID=c("a","c"),dat1=c("01/05/2017","01/05/2017"),dat2=c("14/05/2017","23/05/2017"),newvar=c(13,22)) 

Aktuelle Code:

library(dplyr) 
df2 <- df1 %>% mutate(newvar = as.Date(dat2) - as.Date(dat1)) %>% 
     filter(newvar <= 30) 

Antwort

1

Wir müssen Date Klasse konvertieren die vor tun Subtraktion

library(dplyr) 
library(lubridate) 
df1 %>% 
    mutate_at(2:3, dmy) %>% 
    mutate(newvar = as.numeric(dat2- dat1)) %>% 
    filter(newvar <=30) 

Die muss auch das format Argument enthalten, andernfalls wird es denken, dass das Format in der akzeptierten %Y-%m-%d ist. Hier ist es in %d/%m/%Y

df1 %>% 
    mutate(newvar = as.numeric(as.Date(dat2, "%d/%m/%Y") - as.Date(dat1, "%d/%m/%Y"))) %>% 
    filter(newvar <= 30) 
# ID  dat1  dat2 newvar 
#1 a 01/05/2017 14/05/2017  13 
#2 c 01/05/2017 23/05/2017  22 
Verwandte Themen