2012-02-23 3 views
6

У меня есть dataframe, где первый столбец является датой в формате d/m/y, а второй - числовым значением (продажами).Подмножество DataFrame за указанный месяц и год

Я хочу создать подмножества для каждого месяца в году (например, 11/11, 12/11 и т. Д.). Я попытался код, предложенный в этом ответе: subset a data.frame with multiple conditions

и это работает, когда условие на месяц налагается:

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

но он возвращает пустое подмножество с сообщением об ошибке invalid 'x' argument, когда я добавить условие год:

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

Я использую R 2.10.1-2 на Ubuntu 10.04, спасибо за помощь, которую вы можете дать.

ответ

4

Поскольку вы не предоставили набор данных, я сделал свой собственный из предоставленной вами ссылки. Ваш метод работает для меня, и я получаю пустой набор данных только в том случае, если я не согласен с обоими условиями (месяц и год), поэтому я предполагаю, что вы пытаетесь подмножить серию дат (месяц и год), который не существует (но не может точно сказать, без кода, который вы используете). Вот код, который я использовал:

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

После нескольких попыток, мой код работает с использованием, в ноябре 2011 года: подмножество (продажи, format.Date (дата, "% м") == "11" и format.Date (date ",% d") == "11"). Я думаю, что проблема заключается в команде read.csv, которую я использовал для создания dataframe, но это другая проблема. Я могу считать, что мой первоначальный вопрос будет аннулирован. –

2

Этот ответ избегает subset, обрабатывает отсутствующие наблюдения и использует as.POSIXct формат даты/времени. Хотя, остальная часть кода практически такая же, как в ответе Тайлера Ринкера. Обратите внимание, что я должен указать имя переменной даты/времени внутри as.POSIXct, а не использовать имя неформатированной переменной 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

«Y» чувствителен к регистру в датах. Я не знаю, почему, но «м» в течение нескольких месяцев и «d» для дней - это нижний регистр, но «Y» должен быть в верхнем регистре. Это должно работать для вас:

subset(sales, format.Date(date, "%m")=="11" & format.Date(date, "%Y")=="11") 
Смежные вопросы