2012-02-23 13 views
6

Mam ramkę danych, w której pierwsza kolumna jest datą w formacie d/m/y, a druga jest wartością liczbową (sprzedaż).Podział ramki danych na określony miesiąc i rok

Chcę utworzyć podzbiory dla każdego miesiąca jednego roku (np. 11/11, 12/11 itd.). Próbowałem kodu sugerowane w tej odpowiedzi: subset a data.frame with multiple conditions

i działa, gdy warunek na miesiąc narzuca:

subset(sales, format.Date(date, "%m")=="11") 

ale zwraca pusty podzbiór z komunikatem o błędzie invalid 'x' argument kiedy dodać warunek roku:

subset(sales, format.Date(date, "%m")=="11" & format.Date(date, "%y")=="11") 

Używam R 2.10.1-2 na Ubuntu 10.04, dzięki za pomoc, którą możesz dać.

Odpowiedz

4

Ponieważ nie dostarczyłeś zestawu danych, zrobiłem własny z linku, który podałeś. Twoja metoda działa dla mnie i otrzymuję pusty zestaw danych tylko wtedy, gdy nie spełniam obu podanych warunków (miesiąc i rok), więc domyślam się, że próbujesz przesłać serię dat (miesiąc i rok)), który nie istnieje (ale nie może powiedzieć na pewno bez kodu, którego używasz). Oto kod użyłem:

sales <- read.table(text="2372 Kansas KS2000111 HUMBOLDT, CITY OF ATRAZINE 1.3 05/07/2006 
9104 Kansas KS2000111 HUMBOLDT, CITY OF ATRAZINE 0.34 07/23/2006 
9212 Kansas KS2000111 HUMBOLDT, CITY OF ATRAZINE 0.33 02/11/2007 
2094 Kansas KS2000111 HUMBOLDT, CITY OF ATRAZINE 1.4 05/06/2007 
16763 Kansas KS2000111 HUMBOLDT, CITY OF ATRAZINE 0.61 05/11/2009 
1076 Kansas KS2000111 HUMBOLDT, CITY OF METOLACHLOR 0.48 05/12/2002 
1077 Kansas KS2000111 HUMBOLDT, CITY OF METOLACHLOR 0.3 05/07/2006") 

sales$V9 <- as.Date(sales$V9, "%m/%d/%Y") 
names(sales)[9] <- 'date' 
subset(sales, format.Date(date, "%m")=="05" & format.Date(date, "%y")=="07") 
# V1  V2  V3  V4 V5 V6  V7 V8  date 
#4 2094 Kansas KS2000111 HUMBOLDT, CITY OF ATRAZINE 1.4 2007-05-06 

subset(sales, format.Date(date, "%m")=="05" & format.Date(date, "%y")=="10") 
#[1] V1 V2 V3 V4 V5 V6 V7 V8 date 
#<0 rows> (or 0-length row.names) 
+0

Po kilku próbach, mój kod pracował stosując na listopad 2011: podzbioru (sprzedaż, format.Date (data, "% m") == "11" & format.Date (data, "% d") == "11"). Myślę, że problem leży w komendzie read.csv, której użyłem do utworzenia ramki danych, ale jest to inny problem. Mogę rozważyć moje początkowe pytanie w sposób niezadowalający. –

2

Ta odpowiedź unika subset, uchwyty brakujące obserwacje i wykorzystuje as.POSIXct format daty/godziny. Chociaż reszta kodu jest praktycznie taka sama jak w odpowiedzi Tylera Rinkera. Zauważ, że muszę podać nazwę zmiennej daty/czasu wewnątrz as.POSIXct, zamiast używać nazwy niesformatowanej zmiennej Date_Time.

my.data <- read.csv(text = ' 
      Date_Time,  state, city 
    10/05/2011 07:32:40, AK,  aa 
    15/06/2011 13:26:02, AK,  bb 
    19/07/2011 13:26:02, OH,  cc 
        NA, OH,  dd 
    20/05/2012 14:57:27, PA,  ee 
    22/07/2012 14:57:27, AL,  ff 
    20/03/2013 15:03:18, NY,  gg 
', header=TRUE, stringsAsFactors = FALSE, na.strings = 'NA', strip.white = TRUE) 

my.data$my_Date_Time <- as.POSIXct(my.data$Date_Time, format = "%d/%m/%Y %H:%M:%S") 

# Select May 
my.data[format.Date(my.data$my_Date_Time, "%m")=="05" & 
     !is.na(my.data$my_Date_Time),] 

#    Date_Time state city  my_Date_Time 
# 1 10/05/2011 07:32:40 AK aa 2011-05-10 07:32:40 
# 5 20/05/2012 14:57:27 PA ee 2012-05-20 14:57:27 


# Select 2012 
my.data[format.Date(my.data$my_Date_Time, "%Y")=="2012" & 
     !is.na(my.data$my_Date_Time),] 

#    Date_Time state city  my_Date_Time 
# 5 20/05/2012 14:57:27 PA ee 2012-05-20 14:57:27 
# 6 22/07/2012 14:57:27 AL ff 2012-07-22 14:57:27 

# Select May 2012 
my.data[format.Date(my.data$my_Date_Time, "%m")=="05" & 
     format.Date(my.data$my_Date_Time, "%Y")=="2012" & 
     !is.na(my.data$my_Date_Time),] 

#    Date_Time state city  my_Date_Time 
# 5 20/05/2012 14:57:27 PA ee 2012-05-20 14:57:27 
0

W "Y" rozróżniana jest wielkość liter. Nie wiem dlaczego, ale "m" od miesięcy i "d" od dni są małe, ale "Y" musi być pisane wielkimi literami. To powinno działać dla Ciebie:

subset(sales, format.Date(date, "%m")=="11" & format.Date(date, "%Y")=="11") 
Powiązane problemy