2012-02-23 130 views
6

我有一個數據幀,其中第一列是在d /米/ Y格式的日期和第二個是一個數字值(銷售)一個數據幀。子集爲指定月份和年份

我想爲一年(如: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") 

我在Ubuntu 10.04上使用R 2.10.1-2,感謝您的幫助。

回答

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年11月:子集(銷售,format.Date(日期,「%m」)==「11」&format.Date(日期,「%d」)==「11」)。我認爲問題在於我用來創建數據框的read.csv命令,但這是一個不同的問題。我可以認爲我最初的問題是令人滿意的。 – 2012-02-23 14:52:54

2

這個答案避免subset,處理缺少的觀察和使用as.POSIXct日期/時間格式。儘管如此,其餘的代碼與Tyler Rinker的答案几乎相同。請注意,我必須指定內部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」在日期中區分大小寫。我不知道爲什麼,但幾個月的「m」和幾天的「d」都是小寫,但「Y」必須是大寫。這應該適合你:

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