2016-07-16 16 views
0

Ich habe wie diese gesetzten Reisetransaktionsdaten (über 560.000 Fahrten): Datenrahmen 1Wie wird das wöchentliche Profil mit R bereitgestellt?

ID  START TIME   DATE   ORIGIN DESTINATION  DAY 
1005   9.10   2012-01-02   A  B   Monday 
1005   18.15   2012-01-02   B  A   Monday 
1005   9.05   2012-01-08   A  B   Sunday 
1005   17.05   2012-01-08   B  A   Sunday 
1010   8.00   2012-01-09   A  C   Monday 
1010   12.00   2012-01-09   C  A   Monday 
1013   13.15   2012-01-10   D  E   Tuesday 
1013   15.30   2012-01-10   E  G   Tuesday 
1013   9.06   2012-01-12   D  E   Thursday 
...   ...   2012-..-..   .  .   ... 

und ID-Index wie diese (etwa 1986 IDs): Dataframe 2

ID 
1005 
1010 
1013 
1015 
1030 
1034 
1036 
1031 
1040 
... 

Ich möchten ein erstellen Wochenreiseprofil basierend auf diesen beiden Datenrahmen. Ich bin nicht sicher, ob ich richtig, aber ich versuchte, diese Codes:

weekday = c("Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") 
    br = seq(0,23,by=1) 
ranges = paste(head(br,-1), br[-1], sep="_") 

      for (i in dataframe2$ID) { 

        for (n in weekday){ 
        x= filter(dataframe1,dataframe1$ID %in% i & dataframe1$DAY %in% n) 
        freq = hist(as.numeric(x), br, include.lowest=TRUE, plot=FALSE) 
        df = as.data.frame(t(data.frame(frequency = freq$counts))) 
        df$i = i 
        df$n = n 
        colnames(df) = c(as.character(ranges),"ID","Day") 
        write.table(head(df),file="testdata1.csv", append=TRUE,sep=",",col.names=FALSE,row.names=FALSE) 
        } 
       } 

ich mit einer csv-Tabelle am Ende will ihre wöchentliche Reise Frequenz enthält. Ich möchte auch fragen, ob es einen einfachen Weg gibt, diese Aufgabe zu vereinfachen.

ID  0_1 1_2 2_3 3_4 4_5 5_6 6_7 7_8 8_9 9_10 10_11 11_12 12_13 13_14 14_15 15_16 16_17 17_18 18_19 19_20 20_21 21_22 22_23 Day 
1005 0 0 0 0 0 0 0 0 0 1  0  0  0  0  0  0  0  1  0  0  0  0  0 Sunday 
1005 0 0 0 0 0 0 0 0 0 1  0  0  0  0  0  0  0  1  0  0  0  0  0 Monday 
1005 0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0 Tuesday 
1005                               Wednesday 
1005                               Thursday 
1005                               Friday 
1005                              Saturday 
1010                               Sunday 
1010 
1010 
1010 
1010 
1010 
1010 

am Ende möchte ich ein Diagramm wie folgt erzeugen: enter image description here

+0

es ist besser, wenn Sie 'Ihre Daten dput' –

Antwort

1

Diese in der Basis R mit der Funktion xtabs getan werden kann, aber es kann ein bisschen mehr klar sein, wenn wir es mit tun die dplyr und tidyr Pakete. Bei diesem Ansatz wird weekday als eine R-Faktor-Variable erstellt. Die dplyr-Funktion mutate wird dann verwendet, um DAY in einen Faktor und START_TIME in eine ganze Zahl zu konvertieren. Als nächstes verwenden wir complete aus dem tidyr Paket, um einen neuen erweiterten Datenrahmen mit einer Zeile für jeden Wert von ID, DAY und START_TIME zu erstellen, indem wir deren kompletten Wertebereich verwenden (zB eine Zeile für jede ID, für jede Startzeit in 0:23 und jeden Tag der Woche die Werte für DATE, ORIGIN und DESTINATION werden dort eingesetzt, wo sie existieren,. da sonst die DATE, ORIGIN, und DESTINATION Spalten NA Werte die Anzahl der Fahrten pro ID, DAY, und START_TIME, als die Summe der Zeilen berechnet wird, welche. nicht NA für den Wert DATE und gespeichert in Freq. Die spread Funktion von tidyr wird verwendet, um jeden einzelnen Wert von Freq in eine separate Spalte zu konvertieren. Schließlich werden die richtigen Spaltennamen zugewiesen, die Spalten werden in der angeforderten Reihenfolge angeordnet und der Datenrahmen wird als CSV in eine Datei geschrieben.

library(dplyr) 
    library(tidyr) 
# 
# input data is in df 
# convert colunm name START TIME to syntactically correct version START_TIME 
# 
    colnames(df)[2] <- "START_TIME" 
# 
# define weekday as a factor with the days of week 
# 
    weekday <- c("Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") 
    weekday <- factor(weekday, levels=weekday) 
# 
# sum number for trips by ID, DAY, and START_TIME 
# 
    trip_freq <- df %>% mutate(DAY = factor(DAY, levels=levels(weekday)), 
           START_TIME=floor(START_TIME)) %>% 
         complete(ID, DAY=weekday, START_TIME=0:23) %>% 
         group_by(ID, DAY, START_TIME) %>% 
         summarise(Freq = sum(!is.na(DATE))) 
    trip_freq_tbl <- trip_freq %>% spread(key = START_TIME, value=Freq) 
# 
# name and re-arrange columns 
# 
    colnames(trip_freq_tbl) <- c("ID", "Day", paste(0:23,1:24,sep="_")) 
    trip_freq_tbl <- cbind(trip_freq_tbl[,-2], Day=trip_freq_tbl[,"Day"])    
# 
# write trip_freq as csv fle 
# 
    write.table(trip_freq_tbl, file="testdata1.csv", sep=",", row.names=FALSE)  

Sie können ferner die Daten für Ihre Handlung zusammenfassen mit

# 
# summarize the data for the plot 
# 
    trip_freq_plot <- trip_freq %>% group_by(DAY, START_TIME) %>% 
            summarize(Cnt = sum(Freq))