2017-01-23 7 views
1

Ich habe eine Zeitreihendaten:Wie umgestalten Sie basierend auf der Zeit?

date value 
12 2016-08-05 854 
13 2016-07-29 1065 
14 2016-07-22 878 
15 2016-07-15 1145 
16 2016-07-08 735 
17 2016-07-01 730 
18 2016-06-24 726 
19 2016-06-17 1011 
20 2016-06-10 1019 

Was ich will, ist eine Matrix aus monatlichen Daten:

Jan Feb March ... (more months) 
123 222 555 
234 333 555 
456 444 666 

Wie umformen ich die Eingabedaten an den gewünschten Ausgang? Ich glaube, reshape Funktion kann hilfreich sein, aber nicht sicher, wie.

Antwort

1

Wir schaffen die Spalte ‚Monats‘ durch das ‚Datum‘ zu Date Klasse Umwandlung format den ‚Monat‘ zu extrahieren, wandelt es in factor mit levels als month.abb angegeben und dcast es dann zu ‚breit‘ Format

library(data.table) 
setDT(df1)[, Month := factor(format(as.Date(date), "%b"), levels = month.abb)] 
dcast(df1, rowid(Month)~Month, value.var = "value", drop = FALSE, fill = 0) 

Oder wir tun können, um dieses tidyverse

library(dplyr) 
library(tidyr) 
df1 %>% 
    group_by(Month = factor(month.abb[month(date)], levels = month.abb)) %>% 
    mutate(ind = row_number()) %>% 
    spread(Month, value, drop = FALSE, fill=0) 
2

Folgendes sollte ebenfalls funktionieren:

df <- read.table(text='date value 
       12 2016-08-05 854 
       13 2016-07-29 1065 
       14 2016-07-22 878 
       15 2016-07-15 1145 
       16 2016-07-08 735 
       17 2016-07-01 730 
       18 2016-06-24 726 
       19 2016-06-17 1011 
       20 2016-06-10 1019 
       21 2015-06-01 225', header=TRUE, stringsAsFactors=FALSE) 

library(dplyr) 
library(tidyr) 
df$date <- as.Date(df$date) 
df$month <- format(df$date, '%b') 
df$year <- format(df$date, '%Y') 
df <- df[c('year', 'month', 'value')] 
df %>% group_by(month, year) %>% summarise(value=sum(value)) %>% spread(month, value) 

# year Aug Jul Jun 
# (chr) (int) (int) (int) 
#1 2015 NA NA 225 
#2 2016 854 4553 2756 
+0

Upvoted. Wie kann ich die richtige Bestellung bekommen: Jan, Feb, Mar ....? –

Verwandte Themen