2017-12-03 1 views
2

Das Dataset stellt dar, welcher Client (Cstid = Kunden-ID) an welchem ​​Tag einen Kauf getätigt hat.Plotten Sie die Kaufzahl pro Tag und Monat in R

Ich habe Schwierigkeiten, eine Lösung zu finden, um die Anzahl der Kauf pro Tag und Monat zu plotten.

Hier finden Sie ein Beispiel des Datensatzes, ich habe insgesamt 7505 Beobachtungen.

"Cstid" "Date" 
1 4195  19/08/17 
2 3937  16/08/17 
3 2163  07/09/17 
4 3407  08/10/16 
5 4576  04/11/16 
6 3164  16/12/16 
7 3174  18/08/15 
8 1670  18/08/15 
9 1671  18/08/15 
10 4199  19/07/14 
11 4196  19/08/14 
12 6725  14/09/14 
13 3471  14/09/13 

Ich habe durch die Umwandlung der Spalte Datum gestartet:

df$Date <- as.Date(df$Date, '%d/%m/%Y') 

Dann die Anzahl der Beobachtungen pro Daten mit gezählt:

library(data.table) 
dt <- as.data.table(df) 
dt[,days:=format(Date,"%d.%m.%Y")] 
dt1 <- data.frame(dt[,.N,by=days]) 

und versuchte mit plotten:

plot(dt1$days, dt1$N,type="l") 

Aber ich bekomme t er folgende Fehlermeldung:

Error in plot.window(...) : need finite 'xlim' values 
In addition: Warning messages: 
1: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion 
2: In min(x) : no non-missing arguments to min; returning Inf 
3: In max(x) : no non-missing arguments to max; returning -Inf 

Könnte jemand bitte informieren, wie ich fortfahren sollte?

+0

Bitte zeigen Sie Ihren Versuch (e) es aufgetragen ist. – jmuhlenkamp

+1

@jmuhlenkamp danke für das Feedback. Ich habe die Frage bearbeitet und die Fehlermeldung, die ich bekomme, hinzugefügt. –

+0

Wie in meiner Antwort erwähnt, wählen Sie wahrscheinlich das falsche Jahrformat. – Uwe

Antwort

2

Sie müssen ein 2-stelliges Jahr unter Verwendung %y (Kleinbuchstaben) angeben, um die Date Spalte von Zeichen in Klasse Date zu konvertieren.

Wenn ggplot2 zum Plotten verwendet wird, wird auch die Aggregation durchgeführt. geom_bar() verwendet standardmäßig die count Statistik. Dies erspart uns, die Aggregate (Counts) vorher zu berechnen.

Für die Aggregation nach Monat empfehle ich, alle Daten auf den ersten Tag jedes Monats zu mappen, z. B. mit lubridate::floor_date(). Dies hält eine kontinuierliche Skala auf der X-Achse.

also der vollständige Code wäre:

# convert Date from character to class Date using a 2 digit year 
df$Date <- as.Date(df$Date, '%d/%m/%y') 

library(ggplot2) 
# aggregate by day 
ggplot(df) + aes(x = Date) + 
    geom_bar() 

enter image description here

#aggregate by month 
ggplot(df) + aes(x = lubridate::floor_date(Date, "month")) + 
    geom_bar() 

enter image description here

Alternativ können die Daten in Zeichen Monat abgebildet werden, zum Beispiel "2015-08". Aber das wird die x-Achse in eine diskrete Skala drehen, die nicht mehr die verstrichene Zeit zwischen Käufen zeigt:

# aggregate by month using format() to create discrete scale 
ggplot(df) + aes(x = format(Date, "%Y-%m")) + 
    geom_bar() 

enter image description here

1
#reproduciable data: 
df <- data.frame(Cstid=c(4195,3937,2163,3407,4576,3164,3174,1670,1671,4199,4196,6725,3471), 
      Date=c('19/08/17','16/08/17','07/09/17','08/10/16','04/11/16','16/12/16','18/08/15','18/08/15', 
'18/08/15','19/07/14','19/08/14','14/09/14','14/09/13')) 
#convert format: 
df$Date <- as.character(df$Date) 
Y <- paste('20',sapply(strsplit(df$Date,split = '/'),function(x){x[3]}),sep='') 
M <- sapply(strsplit(df$Date,split = '/'),function(x){x[2]}) 
D <- sapply(strsplit(df$Date,split = '/'),function(x){x[1]}) 
df$Date <- as.POSIXct(paste(Y,M,D,sep='-'),format='%Y-%m-%d') 
#count per day plot: 
days <- unique(df$Date) 
dcount <- vector() 
for (i in 1:length(days)) { 
dcount[i] <- nrow(df[df$Date==days[i],]) 
} 
library(ggplot2) 
ggplot(data=data.frame(days,dcount),aes(x=days,y=dcount))+geom_point() 
#count per month plot: 
df$month <- months(df$Date) 
mon <- unique(df$month) 
mcount <- vector() 
for (i in 1:length(mon)) { 
    mcount[i] <- nrow(df[df$month==mon[i],]) 
} 
ggplot(data.frame(mon,mcount),aes(x=mon,y=mcount))+geom_point() 
+0

Die Uwe-Methode zur Konvertierung von Datumsformaten ist viel effizienter. –

+0

Und 'geom_bar (stat = 'count')' kann die Zählung selbst durchführen. Wenn Sie jedoch ein "Punkt" - oder "Linien" -Diagramm wünschen, können Sie zuerst den Zählzeit-Datenrahmen konstruieren. –

+0

Verstanden! Danke @ YQ.Wang –