2012-02-23 7 views
6

Tengo un marco de datos donde la primera columna es una fecha en formato d/m/y, y el segundo es un valor numérico (ventas).Subcontratación de un marco de datos para un mes y año especificado

Quiero crear subconjuntos para cada mes de un año (por ejemplo, 11/11, 12/11, etc.). He probado el código sugerido en esta respuesta: subset a data.frame with multiple conditions

y funciona cuando se impone la condición en el mes:

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

pero devuelve un subconjunto vacío con el mensaje de error invalid 'x' argument cuando agrego la condición año:

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

Estoy usando R 2.10.1-2 en Ubuntu 10.04, gracias por la ayuda que puede dar.

Respuesta

4

Dado que no proporcionó un conjunto de datos, hice el mío desde el enlace que proporcionó. Tu método funciona para mí y obtengo un conjunto de datos vacío solo si no cumplo con las dos condiciones (mes y año), así que supongo que estás intentando subconjuntar una serie de fechas (mes y año).) que no existe (pero no puede decir con certeza sin el código que está usando). Aquí está el código utilicé:

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

Después de varios intentos, mi código trabajaron usando, para noviembre de 2011: subconjunto (ventas, format.Date (fecha, "% m") == "11" y format.Date (fecha, "% d") == "11"). Creo que el problema radica en el comando read.csv que utilicé para crear el marco de datos, pero este es un problema diferente. Puedo considerar mi pregunta inicial como satisfactoria. –

2

Esta respuesta evita subset, se ocupa de las observaciones que faltan y utiliza el formato as.POSIXct fecha/hora. Aunque, el resto del código es prácticamente el mismo que en la respuesta de Tyler Rinker. Tenga en cuenta que debo especificar el nombre de la variable de fecha/hora dentro de as.POSIXct en lugar de usar el nombre de la variable sin formato 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

La "Y" distingue entre mayúsculas y minúsculas en las fechas. No sé por qué, pero la "m" durante meses y la "d" durante días son minúsculas, pero la "Y" debe estar en mayúscula. Esto debería funcionar para usted:

subset(sales, format.Date(date, "%m")=="11" & format.Date(date, "%Y")=="11") 
Cuestiones relacionadas