2016-10-24 5 views
1

Dies sollte eine schnelle und einfache Frage sein. Unter Verwendung des einfachen Datenrahmens möchte ich dplyr und lubridate verwenden, um alle Clients zu gruppieren, die am oder nach dem April 2015 ein OnsetDate haben. Diese Gruppe würde "NewOnset" heißen und der Rest wäre "OldOnset".Erstellen von Untergruppen basierend auf dem Zeitraum mit Lubridate und Dplyr

Ich bin neu zu lubridate und einige Probleme.

City<-c("Toronto", "Toronto", "Montreal","Ottawa","Ottawa", 
     "Hamilton","Peterborough","Toronto","Hamilton","Hamilton") 

OnsetDate<-c("11/04/1980","04/08/2005","04/19/2015","07/10/2015","10/10/1999","03/11/2016","09/12/2011","06/10/2015","02/05/1988","08/08/2016") 

Client<-c("Cl1","Cl2","Cl3","Cl4","Cl5","Cl6","Cl7","Cl8","Cl9","Cl10") 

DF<- data.frame(Client,City,OnsetDate) 
+0

'% DF>% mutieren (OnsetDate = as.Date (OnsetDate, '% m /% d /% Y'))%>% group_by (group = if_else (OnsetDate> as.Datum ('2015-04-01'), 'NewOnset', 'OldOnset')) oder ersetzen Sie 'lubridate :: mdy' für' as.Date' – alistaire

+0

Vielen Dank! Ich kann Ihnen Anerkennung zollen, wenn Sie es zu einer offiziellen Antwort machen. – Mike

Antwort

0

Mit dplyr,

 # parse OnsetDate to Date; alternatively use lubridate::mdy(OnsetDate) 
DF %>% mutate(OnsetDate = as.Date(OnsetDate, '%m/%d/%Y')) %>% 
    # add and group by new column 
    group_by(group = if_else(OnsetDate >= as.Date('2015-04-01'), # condition 
          'NewOnset', # return if above (true) 
          'OldOnset')) # return if below (false) 

## Source: local data frame [10 x 4] 
## Groups: group [2] 
## 
## Client   City OnsetDate group 
## <fctr>  <fctr>  <date> <chr> 
## 1  Cl1  Toronto 1980-11-04 OldOnset 
## 2  Cl2  Toronto 2005-04-08 OldOnset 
## 3  Cl3  Montreal 2015-04-19 NewOnset 
## 4  Cl4  Ottawa 2015-07-10 NewOnset 
## 5  Cl5  Ottawa 1999-10-10 OldOnset 
## 6  Cl6  Hamilton 2016-03-11 NewOnset 
## 7  Cl7 Peterborough 2011-09-12 OldOnset 
## 8  Cl8  Toronto 2015-06-10 NewOnset 
## 9  Cl9  Hamilton 1988-02-05 OldOnset 
## 10 Cl10  Hamilton 2016-08-08 NewOnset 

Beachten Sie die Gruppierung hier nicht nichts tun, und man konnte beiden Operationen in mutate tun, aber Sie tun, um ein gruppierte Daten erhalten .Frame passend für weitere Mutation oder Zusammenfassung.

Eine Alternative wäre cut.Date, zu verwenden, die einen Faktor zurück:

# parse OnsetDate to Date; alternatively use lubridate::mdy(OnsetDate) 
DF %>% mutate(OnsetDate = as.Date(OnsetDate, '%m/%d/%Y')) %>% 
    # add and group by new column 
    group_by(group = cut(OnsetDate, 
         breaks = c(min(OnsetDate), as.Date('2015-04-01'), max(OnsetDate)), 
         labels = c('OldOnset', 'NewOnset'), 
         include.lowest = TRUE)) 

## Source: local data frame [10 x 4] 
## Groups: group [2] 
## 
## Client   City OnsetDate group 
## <fctr>  <fctr>  <date> <fctr> 
## 1  Cl1  Toronto 1980-11-04 OldOnset 
## 2  Cl2  Toronto 2005-04-08 OldOnset 
## 3  Cl3  Montreal 2015-04-19 NewOnset 
## 4  Cl4  Ottawa 2015-07-10 NewOnset 
## 5  Cl5  Ottawa 1999-10-10 OldOnset 
## 6  Cl6  Hamilton 2016-03-11 NewOnset 
## 7  Cl7 Peterborough 2011-09-12 OldOnset 
## 8  Cl8  Toronto 2015-06-10 NewOnset 
## 9  Cl9  Hamilton 1988-02-05 OldOnset 
## 10 Cl10  Hamilton 2016-08-08 NewOnset 
1

Keine Notwendigkeit, externes Paket zu verwenden, um diese einfache Aufgabe zu erledigen. In Basis R:

## coerce character to a valid date 
DF$OnsetDate <- as.Date(DF$OnsetDate ,"%m/%d/%Y") 
## flter rows 
DF[DF$OnsetDate>"2015-04-30",] 

# Client  City OnsetDate 
# 4  Cl4 Ottawa 2015-07-10 
# 6  Cl6 Hamilton 2016-03-11 
# 8  Cl8 Toronto 2015-06-10 
# 10 Cl10 Hamilton 2016-08-08 
1

Sie können dies ohne dplyr Funktionalität tun. Lubridates Familie von Funktionen wird nach dem Format des Objekts benannt, das Sie in ein Datum konvertieren. In diesem Fall möchten Sie die Funktion mdy verwenden, da das Eingabeformat in Monat-Tag-Jahr liegt.

DF$OnsetDate <- mdy(DF$OnsetDate)

Dann können Sie Ihren neuen Datenrahmen erstellen, indem Sie die Zeilen auf Ihren Kriterien subsetting.

NewOnset <- DF[DF$OnsetDate >= as.Date("2015-04-01"), ] 
OldOnset <- DF[DF$OnsetDate < as.Date("2015-04-01"), ] 
1

Ein paar Probleme mit Ihrem Code. Dies sollte es beheben:

City <- c("Toronto", "Toronto", "Montreal", "Ottawa", "Ottawa", "Hamilton", "Peterborough", "Toronto", "Hamilton", "Hamilton") 
OnsetDate <- c("11/04/1980","04/08/2005","04/19/2015","07/10/2015","10/10/1999","03/11/2016","09/12/2011","06/10/2015","02/05/1988","08/08/2016") 
Client <- c("Cl1","Cl2","Cl3","Cl4","Cl5","Cl6","Cl7","Cl8","Cl9","Cl10") 

df <- data.frame(Client, City, OnsetDate) 

df$OnsetDate <- as.Date(df$OnsetDate, format = "%m/%d/%Y")  

# here comes the magic 
df %>% filter(OnsetDate > as.Date("04/01/2015", format = "%m/%d/%Y")) 

Sie die format Parameter verwenden kann, und es gibt keine wirkliche Notwendigkeit für das lubridate Paket hier. Der obige Code ergibt:

Client  City OnsetDate 
1 Cl3 Montreal 2015-04-19 
2 Cl4 Ottawa 2015-07-10 
3 Cl6 Hamilton 2016-03-11 
4 Cl8 Toronto 2015-06-10 
5 Cl10 Hamilton 2016-08-08 
Verwandte Themen