2017-07-11 2 views
2

Dieses Problem ist mit einer Frage verbunden, die ich earlier fragte. Ich habe einige Zeit damit verbracht, darüber nachzudenken, wie ich mein Problem klarer vermitteln und mich für die wortreiche Frage entschuldigen kann. Jeder Rat wird sehr geschätzt.Ist lubridate nicht wie Subsetting?

Im Folgenden finden Sie ein stark untergliedertes Hundert-Zeilen-Snippet des Datasets, mit dem ich arbeite.

SPD_2015 <- structure(list(summarized.offense.description = c("ASSAULT", 
"THREATS", "CAR PROWL", "SHOPLIFTING", "MAIL THEFT", "THREATS", 
"DISTURBANCE", "STOLEN PROPERTY", "TRESPASS", "VEHICLE THEFT", 
"CAR PROWL", "THREATS", "STOLEN PROPERTY", "VEHICLE THEFT", "BURGLARY-SECURE PARKING-RES", 
"CAR PROWL", "THREATS", "BIKE THEFT", "BURGLARY", "ASSAULT", 
"STOLEN PROPERTY", "DISTURBANCE", "VEHICLE THEFT", "CAR PROWL", 
"OTHER PROPERTY", "ASSAULT", "PROPERTY DAMAGE", "BURGLARY-SECURE PARKING-RES", 
"ANIMAL COMPLAINT", "OTHER PROPERTY", "BURGLARY", "BURGLARY", 
"CAR PROWL", "SHOPLIFTING", "BURGLARY", "PROPERTY DAMAGE", "DISTURBANCE", 
"PROPERTY DAMAGE", "STOLEN PROPERTY", "OTHER PROPERTY", "MAIL THEFT", 
"PROPERTY DAMAGE", "VEHICLE THEFT", "OTHER PROPERTY", "ROBBERY", 
"CAR PROWL", "NARCOTICS", "OTHER PROPERTY", "BURGLARY", "DISTURBANCE", 
"ASSAULT", "BURGLARY-SECURE PARKING-RES", "OTHER PROPERTY", "FRAUD", 
"SHOPLIFTING", "OTHER PROPERTY", "OTHER PROPERTY", "DISTURBANCE", 
"CAR PROWL", "STOLEN PROPERTY", "OTHER PROPERTY", "OTHER PROPERTY", 
"VIOLATION OF COURT ORDER", "DISTURBANCE", "NARCOTICS", "ASSAULT", 
"DISTURBANCE", "TRESPASS", "NARCOTICS", "CAR PROWL", "NARCOTICS", 
"OTHER PROPERTY", "CAR PROWL", "CAR PROWL", "ASSAULT", "TRAFFIC", 
"OTHER PROPERTY", "CAR PROWL", "PROSTITUTION", "OTHER PROPERTY", 
"OTHER PROPERTY", "ASSAULT", "BURGLARY", "DISTURBANCE", "PROPERTY DAMAGE", 
"PROPERTY DAMAGE", "BURGLARY", "VEHICLE THEFT", "FRAUD", "VEHICLE THEFT", 
"FRAUD", "CAR PROWL", "BIKE THEFT", "CAR PROWL", "WARRANT ARREST", 
"STOLEN PROPERTY", "CAR PROWL", "PROPERTY DAMAGE", "VEHICLE THEFT", 
"BIKE THEFT"), occurred.date.or.date.range.start = c("04/17/2015 01:10:00 AM", 
"11/15/2015 12:04:00 PM", "05/29/2015 08:00:00 PM", "12/15/2015 02:25:00 PM", 
"07/28/2015 12:00:00 AM", "02/24/2015 06:01:00 PM", "05/24/2015 04:20:00 PM", 
"03/13/2015 02:04:00 PM", "06/14/2015 08:00:00 AM", "05/19/2015 03:18:00 PM", 
"07/18/2015 06:00:00 AM", "05/11/2015 05:16:00 PM", "01/08/2015 12:52:00 PM", 
"06/17/2015 05:00:00 PM", "07/04/2015 12:00:00 AM", "10/26/2015 12:12:00 AM", 
"05/01/2015 12:00:00 PM", "07/02/2015 10:00:00 PM", "01/10/2015 07:30:00 PM", 
"02/17/2015 01:29:00 PM", "12/17/2015 02:26:00 AM", "08/04/2015 10:49:00 PM", 
"10/27/2015 12:29:00 AM", "07/29/2015 03:00:00 PM", "10/24/2015 06:30:00 PM", 
"02/20/2015 03:07:00 AM", "11/11/2015 09:00:00 AM", "03/24/2015 10:00:00 PM", 
"11/03/2015 08:47:00 PM", "04/15/2015 02:00:00 PM", "07/15/2015 03:00:00 PM", 
"11/17/2015 08:30:00 AM", "09/22/2015 05:00:00 PM", "02/09/2015 09:19:00 AM", 
"01/07/2015 08:30:00 AM", "05/01/2015 07:30:00 AM", "04/26/2015 03:30:00 AM", 
"04/18/2015 03:00:00 AM", "10/01/2015 08:00:00 PM", "05/07/2015 01:00:00 AM", 
"02/05/2015 03:15:00 PM", "01/18/2015 05:00:00 PM", "10/17/2015 11:00:00 PM", 
"03/23/2015 05:35:00 PM", "02/16/2015 07:25:00 PM", "07/30/2015 08:00:00 PM", 
"11/10/2015 02:28:00 PM", "03/14/2015 10:10:00 AM", "12/10/2015 08:26:00 PM", 
"10/05/2015 01:45:00 AM", "02/16/2015 01:56:00 PM", "10/19/2015 06:27:00 PM", 
"12/01/2015 07:30:00 AM", "01/28/2015 08:40:00 PM", "05/01/2015 01:40:00 PM", 
"10/30/2015 03:15:00 AM", "09/04/2015 03:34:00 PM", "06/06/2015 04:53:00 PM", 
"07/22/2015 06:20:00 AM", "12/11/2015 01:41:00 PM", "05/20/2015 01:09:00 PM", 
"09/18/2015 12:00:00 PM", "07/08/2015 11:05:00 PM", "02/22/2015 01:38:00 AM", 
"07/22/2015 01:12:00 PM", "09/07/2015 10:43:00 AM", "08/11/2015 04:00:00 PM", 
"10/13/2015 06:33:00 AM", "10/10/2015 05:32:00 PM", "11/15/2015 07:09:00 PM", 
"11/19/2015 03:05:00 PM", "04/08/2015 04:33:00 PM", "05/11/2015 12:01:00 AM", 
"04/21/2015 06:15:00 PM", "06/13/2015 10:29:00 AM", "06/22/2015 06:41:00 PM", 
"09/03/2015 08:00:00 AM", "04/08/2015 06:00:00 PM", "07/17/2015 08:00:00 PM", 
"08/29/2015 09:00:00 AM", "04/28/2015 01:46:00 PM", "09/07/2015 07:00:00 PM", 
"12/30/2015 06:30:00 AM", "08/29/2015 11:37:00 PM", "08/24/2015 10:00:00 PM", 
"06/17/2015 07:02:00 AM", "02/14/2015 10:21:00 PM", "03/29/2015 07:00:00 PM", 
"10/01/2015 07:15:00 AM", "06/14/2015 03:00:00 PM", "12/16/2014 09:00:00 AM", 
"02/14/2015 07:54:00 PM", "10/02/2015 08:17:00 AM", "05/14/2015 08:30:00 AM", 
"07/07/2015 10:15:00 AM", "04/07/2015 01:48:00 AM", "11/02/2015 11:00:00 PM", 
"04/16/2015 03:00:00 PM", "08/22/2015 08:09:00 AM", "10/24/2015 05:00:00 PM" 
)), .Names = c("summarized.offense.description", "occurred.date.or.date.range.start" 
), row.names = c(NA, -100L), class = c("tbl_df", "tbl", "data.frame" 
)) 

Ich verwende den folgenden Code Zeitdaten von bereits existierenden Spalten zu extrahieren:

#Splitting time from column occured.date 
SPD_2015 <- mutate(SPD_2015, occurred.time = str_sub(SPD_2015$occurred.date.or.date.range.start, -11, -1)) 

#Converting character to time for occured.time 
SPD_2015$occurred.time <- strptime(SPD_2015$occurred.time, "%I:%M:%S %p") %>% 
    str_sub(-8, -1) %>% 
    hms() 
#creating the occurred.time.hour value so I can isolate the hour value 
SPD_2015 <- mutate(SPD_2015, occurred.time.hour = hour(occurred.time)) 

Jetzt habe ich eine Spalte, die den isolierten Stunden-Wert enthält, dass ein Verbrechen stattgefunden, die ich mit ggplot2 grafisch darstellen kann. Allerdings, wenn ich meine Teilmenge Daten mit dplyr:

#filtering data for only car prowl 
car.prowl <- filter(SPD_2015, summarized.offense.description == "CAR PROWL") 

Die Werte für die Zeit in den Spalten „occurred.time“ und „occurred.time.hour“ In meinen neu erstellten Datenrahmen (car.prowl) nicht mehr übereinstimmen. Die Spalte "accredited.time.hour" stimmt mit der Quelle überein, aber die Spalte "acreded.time" wird jetzt geändert.

Und nur dazu hinzuzufügen. Ich habe eine separate Datenrahmen für Auto prowls denn als ich ursprünglich versucht, die aufgetreten Zeit der Verbrechen plotten ggplot mit

ggplot(car.prowl, aes(hour(occurred.time))) + 
    geom_bar() 

Ich würde den Fehler: „Fehler: Ästhetik muss entweder Länge 1 oder die gleiche wie die Daten sein (14): x ". Was macht Sinn und ich verstehe.

> dim(car.prowl) 
[1] 14 4 

Aber car.prowl hat eine Länge von 14, und wenn ich den folgenden Code eingeben:

> length(hour(car.prowl$occurred.time)) 
[1] 100 

Es zeigt die Länge des ursprünglichen Datensatzes anstelle der Teilmenge Länge von 14

Kann jemand eine Lösung oder einen Workaround vorschlagen? Danke

Antwort

1

Interessante Frage. Lassen Sie uns zuerst die Ausgabe erhalten, die Sie für Ihr Plotten benötigen. Wir können mdy_hms verwenden, um Zeichen in Datum zu konvertieren. Es ist wahrscheinlich robuster als Ihr ursprünglicher Ansatz, indem Sie sub_str verwenden. Danach kann die hour die Stunde basierend auf der Datumszeit extrahieren.

library(tidyverse) 
library(lubridate) 
library(stringr) 

SPD_2015_updated <- SPD_2015 %>% 
    mutate(occurred.time = mdy_hms(occurred.date.or.date.range.start)) %>% 
    mutate(occurred.time.hour = hour(occurred.time)) 

car.prowl_updated <- SPD_2015_updated %>% 
    filter(summarized.offense.description == "CAR PROWL") 

Typ glimpse(SPD_2015_updated) und glimpse(car.prowl_updated). Sie können sehen, dass jeder Datensatz übereinstimmt. occurred.time ist in der Date-Time-Klasse, während occurred.time.hour in der Integer-Klasse ist. Ich denke, dass diese Datenrahmen für Ihr Plotten bereit sind.

Als was für Ihren ursprünglichen Ansatz schief gelaufen ist, verstehe ich nicht vollständig. Aber wenn Sie glimpse(car.prowl) eingeben, können Sie sehen, dass occurred.time in S4: Period ist. Dies könnte der Schlüssel sein, warum dplyr::filter nicht funktionierte. Wenn ich Zeit habe, werde ich weiter untersuchen, warum dplyr::filter Ihren ursprünglichen Datenrahmen nicht unterteilen kann.

+0

Vielen Dank für Ihre Antwort! Ihr Ansatz zum Extrahieren von Datum und Uhrzeit war definitiv effizienter und ich kann mein ursprüngliches Problem darstellen. Ich bin immer noch ein wenig verwirrt darüber, was mit meiner Vorgehensweise schief gelaufen ist, aber ich denke, das ist die Natur von R, bis du all seine kleinen Eigenheiten verstehst. – RunAmuck